Limitación de Mensajes (Throttling)
La tasa de procesamiento de mensajes a veces puede necesitar limitarse para evitar sobrecargar los sistemas aguas abajo y suavizar el tráfico con picos. Tanto los sending como los receiving connectors pueden configurarse para limitar la tasa de mensajes que pueden procesar.
Esto es adicional al backpressure (señalización de demanda) que obtenemos por el uso de Akka Streams en la implementación de la biblioteca de connector. Es decir, si alguna parte del pipeline de procesamiento está funcionando lentamente, entonces el backpressure entrará en juego y, efectivamente, limitará la tasa del sistema.
La diferencia con el throttling es que podemos ajustar la tasa máxima de mensajes en una ventana de tiempo. Esto es especialmente útil si tenemos un sistema aguas abajo más lento que no queremos sobrecargar.
Consideraciones de afinado
Los dos parámetros que pueden ajustarse para el throttling son la duración de la ventana y el número de mensajes. El mecanismo de throttling permitirá pasar mensajes a la tasa que lleguen hasta que se alcance el número máximo de mensajes dentro de la duración de la ventana.
Esto es importante porque podríamos tener dos configuraciones que proporcionen el mismo rendimiento total; por ejemplo:
| Duración de ventana | Número de mensajes | Throughput (TPS) |
|---|---|---|
10 seconds |
1000 |
100 |
1 second |
100 |
100 |
En el primer ejemplo es posible que 1000 mensajes se procesen dentro del primer segundo. Esto significaría que durante los nueve segundos restantes no se procesaría nada. Mientras que en el segundo ejemplo, bajo la misma carga, veríamos una tasa de procesamiento más uniforme ya que la ventana es más pequeña.
Configuración de Throttle
Para configurar el throttling tanto en sending como en receiving connectors, se deben proporcionar una duración y un conteo al construir el connector. Si no se establecen los parámetros de throttle, entonces el connector procesará mensajes conforme lleguen, sin restricciones, aunque con backpressure desde los consumidores aguas abajo.
initiatingReceiveConnectorBuilder()
.withThrottleDuration(Duration.ofMillis(500))
.withThrottleCount(1);