Singleflight: cómo Go elimina el trabajo redundante en sistemas concurrentes

Fuentes: Understanding Singleflight in Go: A Solution for Eliminating Redundant Work — Coding Explorations
Singleflight: cómo Go elimina el trabajo redundante en sistemas concurrentes
Imagen generada con IA

Singleflight es una librería del ecosistema Go (ubicada en golang.org/x/sync/singleflight) que resuelve un problema común en aplicaciones concurrentes: cuando múltiples gorutinas solicitan el mismo recurso simultáneamente, en lugar de ejecutar la operación repetidas veces, singleflight garantiza que dicha operación se ejecute una sola vez y el resultado se comparta entre todos los solicitantes.

¿Por qué es importante?
En sistemas de alta concurrencia, como APIs web o microservicios, es frecuente que muchos usuarios soliciten los mismos datos al mismo tiempo. Sin una estrategia como singleflight, cada solicitud dispararía una llamada independiente hacia bases de datos o APIs externas, generando carga innecesaria, lentitud y costos elevados. Singleflight actúa como un "filtro" inteligente que consolidaría esas solicitudes idénticas en una sola ejecución.

¿Cómo funciona?
El mecanismo se basa en el tipo Group. Cuando una gorutina realiza una solicitud mediante group.Do(clave, función), singleflight verifica si ya existe una operación en vuelo para esa clave específica. Si es la primera, ejecuta la función y almacena el resultado. Las solicitudes subsequentes para la misma clave esperan automáticamente hasta que el primer llamado termine, recibiendo luego el mismo resultado compartido. Este proceso es completamente transparente para el desarrollador.

Casos de uso típicos
Singleflight resulta ideal para consultas a APIs externas que no admiten caché efectivo, datos que cambian frecuentemente, o cálculos computacionalmente costosos. Por ejemplo, en un servicio meteorológico donde miles de usuarios consultan el clima de la misma ciudad simultáneamente, singleflight aseguraría que solo se haga una petición al proveedor externo, compartiendo la respuesta con todos los clientes. También es valioso en arquitecturas de microservicios donde se busca minimizar llamadas redundantes entre servicios.

Consideraciones y limitaciones
Es crucial elegir claves de identificación apropiadas para diferenciar trabajos únicos. Los errores se propagan a todos los waiters, así que debe implementarse manejo robusto de excepciones. Singleflight no reemplaza al caché tradicional; ambos pueden complementarse efectivamente. No es la solución óptima cuando las solicitudes varían significativamente entre sí, ya que perdería su beneficio de consolidación.