amazon web services - sns - Usando Amazon SQS con mĂșltiples consumidores
sqs aws faq (1)
Tengo una aplicación basada en servicios que utiliza Amazon SQS con múltiples colas y múltiples consumidores. Estoy haciendo esto para poder implementar una arquitectura basada en eventos y desacoplar todos los servicios, donde los diferentes servicios reaccionan a los cambios en el estado de otros sistemas. Por ejemplo:
- Servicio de Registro :
- Emite el evento ''registro-nuevo'' cuando un nuevo usuario se registra.
- Servicio de usuario :
- Emite el evento ''actualizado por el usuario'' cuando el usuario se actualiza.
- Servicio de búsqueda :
- Lee de la cola ''registro-nuevo'' e indexa al usuario en la búsqueda.
- Lee de la cola ''actualizado por el usuario'' y actualiza al usuario en la búsqueda.
- Servicio de métricas :
- Lee de la cola de ''registro nuevo'' y envía a Mixpanel.
- Lee de la cola ''actualizado por el usuario'' y envía a Mixpanel.
Tengo una serie de problemas:
- Un mensaje puede ser recibido varias veces al hacer el sondeo. Puedo diseñar muchos de los sistemas para que sean idempotentes, pero para algunos servicios (como el servicio de métricas) sería mucho más difícil.
- Un mensaje debe eliminarse manualmente de la cola en SQS. He pensado en implementar un "servicio de manejo de mensajes" que maneje la eliminación de mensajes cuando todos los servicios los hayan recibido (cada servicio emitirá un evento de "mensaje confirmado" después de manejar un mensaje).
Supongo que mi pregunta es la siguiente: qué patrones debo usar para garantizar que puedo tener varios consumidores en una sola cola en SQS, al tiempo que me aseguro de que los mensajes también se entreguen y eliminen de manera confiable. Gracias por tu ayuda.
Creo que lo estás haciendo mal.
Me parece que estás usando la misma cola para hacer varias cosas diferentes. Es mejor usar una sola cola para un solo propósito.
En lugar de poner un evento en la cola de "registro nuevo" y luego tener dos servicios diferentes sondea esa cola, y AMBOS necesitan leer ese mensaje y ambos hacen algo diferente con él (y luego necesitan un tercer proceso que se supone que debe eliminarlo) mensaje después de que los otros 2 lo hayan procesado).
Una cola debe usarse para un propósito.
Cree una cola de ''búsqueda de índice de usuarios'' y una cola de ''envío a mixpanels'', de modo que el servicio de búsqueda lea de las colas de búsqueda, indexe al usuario e inmediatamente borre el mensaje.
El servicio mixpanel lee de la cola de paneles de mezcla, procesa el
Mensaje y borra el mensaje.
El servicio de registro, en lugar de emitir un ''registro nuevo'' a una sola cola, ahora lo emite a dos colas.
Para dar un paso mejor, agregue SNS a la mezcla aquí y haga que el servicio de registro emita un mensaje SNS al tema "registro nuevo" (no a la cola), y luego suscriba las dos colas que mencioné anteriormente, a ese tema en un patrón de ''abanico de salida''.
https://aws.amazon.com/blogs/aws/queues-and-notifications-now-best-friends/
Ambas colas recibirán el mensaje, pero solo lo cargará en SNS una vez. Si es necesario, un tercer servicio no relacionado también debe procesar los eventos de "registro nuevo", crea otra cola y se suscribe al tema también. ejecutar sin dependencias o conocimiento de lo que están haciendo los otros servicios, ese es el objetivo.