A veces, las canalizaciones de datos experimentan picos en el tráfico publicado. Los picos de tráfico pueden abrumar a los suscriptores si no estás preparado. Una solución sencilla para evitar picos de tráfico es aumentar dinámicamente los recursos de los suscriptores de Pub/Sub para procesar más mensajes. Sin embargo, esta solución puede aumentar los costes o no funcionar al instante. Por ejemplo, puede que necesites muchas máquinas virtuales.
El control de flujo del lado del suscriptor permite a este regular la velocidad a la que se ingieren los mensajes. Por lo tanto, el control de flujo gestiona los picos de tráfico sin aumentar los costes o hasta que se amplía la capacidad del suscriptor.
El control de flujo es una función disponible en la biblioteca de cliente de alto nivel de Pub/Sub. También puedes implementar tu propia programación de control de flujo cuando uses una biblioteca de cliente de bajo nivel.
La necesidad de controlar el flujo indica que los mensajes se publican a un ritmo superior al que se consumen. Si este escenario es un estado persistente en lugar de un pico transitorio en el volumen de mensajes, considera la posibilidad de aumentar el número de instancias de cliente de suscriptor.
Configuración del control de flujo
El control de flujo te permite configurar el número máximo de bytes asignados a las solicitudes pendientes y el número máximo de mensajes pendientes permitidos. Define estos límites en función de la capacidad de procesamiento de tus máquinas cliente.
Los valores predeterminados de las variables de control de flujo y los nombres de las variables pueden variar entre las bibliotecas de cliente. Por ejemplo, en la biblioteca de cliente de Java, las siguientes variables configuran el control de flujo:
setMaxOutstandingElementCount(): define el número máximo de mensajes de los que Pub/Sub no ha recibido confirmaciones o confirmaciones negativas.
setMaxOutstandingRequestBytes(): define el tamaño máximo de los mensajes de los que Pub/Sub no ha recibido confirmaciones ni confirmaciones negativas.
Si se supera el límite de setMaxOutstandingElementCount()
o setMaxOutstandingRequestBytes()
, el cliente suscriptor no extraerá más mensajes. Este comportamiento continúa hasta que se confirman o se rechazan los mensajes que ya se han extraído.
De esta forma, podemos alinear el rendimiento con el coste asociado a la ejecución de más suscriptores.
Ejemplos de código para el control de flujo
Para controlar la velocidad a la que el cliente suscriptor recibe mensajes, usa las funciones de control de flujo del suscriptor. Estas funciones de control de flujo se ilustran en los siguientes ejemplos:
C++
Antes de probar este ejemplo, sigue las instrucciones de configuración de C++ que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C++ de Pub/Sub.
C#
Antes de probar este ejemplo, sigue las instrucciones de configuración de C# que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C# de Pub/Sub.
Go
En el siguiente ejemplo se usa la versión principal de la biblioteca de cliente de Pub/Sub de Go (v2). Si sigues usando la biblioteca v1, consulta la guía de migración a la versión 2. Para ver una lista de ejemplos de código de la versión 1, consulta los ejemplos de código obsoletos.
Antes de probar este ejemplo, sigue las instrucciones de configuración de Go que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Pub/Sub.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración de Java que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Java de Pub/Sub.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración de Python que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de Pub/Sub.
Ruby
En el siguiente ejemplo se usa la biblioteca de cliente de Ruby Pub/Sub v3. Si sigues usando la biblioteca v2, consulta la guía de migración a la versión 3. Para ver una lista de ejemplos de código de Ruby v2, consulta los ejemplos de código obsoletos.
Antes de probar este ejemplo, sigue las instrucciones de configuración de Ruby que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Ruby de Pub/Sub.
Siguientes pasos
Consulta las otras opciones de entrega que puedes configurar para una suscripción:
Gestionar fallos de mensajes con la política de reintentos de suscripción
Reenviar mensajes no entregados a un tema de mensajes fallidos
Volver a reproducir mensajes confirmados anteriormente o eliminar mensajes definitivamente
Ampliar el tiempo de confirmación con la gestión de concesiones