Los posibles inconvenientes de utilizar canales sin búfer en una aplicación a gran escala incluyen:
1. Puntos de sincronización: los canales sin búfer crean puntos de sincronización donde las gorutinas deben esperar a que se completen las demás. Esto puede conducir a una ejecución secuencial, lo que puede no ser deseable en una aplicación a gran escala donde el paralelismo es esencial[1][3][5].
2. Condiciones de carrera ocultas: los canales sin búfer pueden ocultar las condiciones de carrera que ocurrirían con un tamaño de búfer mayor que cero. Esto significa que si necesitas aumentar el tamaño del buffer por razones de rendimiento, de repente tendrás que resolver un montón de condiciones de carrera, lo que puede ser una forma de deuda tecnológica[1].
3. Bloqueo: Los canales sin búfer bloquean tanto al remitente como al receptor hasta que el otro lado esté listo. Esto puede provocar problemas de rendimiento si el receptor es más lento que el emisor o si hay muchas gorutinas compitiendo por el canal[2][3][5].
4. Escalabilidad limitada: los canales sin búfer pueden limitar la escalabilidad de su aplicación porque crean un cuello de botella donde las gorutinas deben esperar a que se completen las demás. Esto puede llevar a una situación en la que la aplicación no utiliza completamente los recursos de CPU disponibles[1][3][5].
5. Complejidad: los canales sin búfer pueden agregar complejidad a su aplicación porque requieren una administración cuidadosa para garantizar que las rutinas no se bloqueen indefinidamente. Esto puede provocar una depuración y un mantenimiento más difíciles[1][3][5].
6. Rendimiento: los canales sin búfer pueden afectar el rendimiento porque crean una sobrecarga adicional para que las gorutinas se esperen entre sí. Esto puede provocar tiempos de respuesta más lentos y un rendimiento reducido[2][3][5].
7. Manejo de errores: los canales sin búfer pueden dificultar el manejo de errores porque pueden provocar interbloqueos si las rutinas no están sincronizadas correctamente. Esto puede llevar a un manejo y depuración de errores más complejos[1][3][5].
En resumen, si bien los canales sin búfer pueden resultar útiles en determinadas situaciones, también pueden introducir importantes inconvenientes en una aplicación a gran escala. Es esencial considerar cuidadosamente las ventajas y desventajas y elegir el tipo de canal apropiado en función de los requisitos específicos de su aplicación.
Citas:[1] https://www.reddit.com/r/golang/comments/9cqcx4/help_understanding_the_use_cases_and_pitfalls_of/
[2] https://www.linkedin.com/pulse/buffered-unbuffered-channels-golang-lucas-schenkel-schieferdecker
[3] https://www.scaler.com/topics/golang/buffered-and-unbuffered-channel-in-golang/
[4] https://clavinjune.dev/en/blogs/buffered-vs-unbuffered-channel-in-golang/
[5] https://notes.shichao.io/gopl/ch8/