jueves, 13 de abril de 2023

Sincronicidad forzada.

 El otro día leí esta entrada de un blog, que estaba en Hacker News, sobre como habían desechado RabbitMQ y se habían quedado usando una tabla de Postgres simulando una cola FIFO con la ayuda de los bloqueos y aislamiento que provee el motor de datos relacionales.

 No la voy a explicar aquí así que, si quieres contexto para el resto de la entrada, te animo a que la leas primero antes de continuar.

Como has podido leer, se está ejecutando un proceso de larga duración (horas) y se esta esperando a que este proceso acabe para mandar un ACK a RabbitMQ. Mientras; el sistema de prefetch del consumidor de mensajes del bus está bloqueando el siguiente mensaje que termina dando una especie de timeout.

Se puede apreciar que están forzando la sincronicidad cuando lo que deberían hacer es abrazar la asincronía. Están equivocando el contexto y significado de los mensajes del proceso.

Pongamos en contexto lo que debería significar cada mensaje y ACK del bus para aceptar la asincronía:

JobMessage - Este es el mensaje inicial del proceso; se crea y se pone en la cola del Bus. Refleja en persistencia la creación de un nuevo Job pendiente de procesar.

ACKJobMessaje - Esto se debe enviar, no cuando el Job ha terminado correctamente, si no cuando JobMessage ha sido validado y procesado correctamente por el consumidor y se ha puesto una maquina a trabajar en el Job sin que haya saltado ningún fallo inmediato. También refleja el cambio en persistencia de poner el estado del Job en "Running".

 Y para abrazar la asincronía hay que introducir un nuevo mensaje:

JobFinished - Este mensaje es enviado al Bus cuando el trabajo de larga duración ha terminado. Marcando efectivamente en persistencia el estado final del Job.

Este patrón me suena... claro! esto es una Saga. Un proceso de larga duración que necesita de persistencia para mantener sus estados intermedios.


Y ya lo tenemos, un simple cambio de lo que significa hacer ACK a un mensaje del Bus consigue que todas las piezas del puzle encajen a la perfección sin tener que sobreexplotar el motor relacional.

No hay comentarios:

Publicar un comentario