sqs sns que programa priority pricing chile certification amazon-web-services amazon-sqs

amazon-web-services - sns - sqs que es



¿Cómo prevenir mensajes duplicados de SQS? (4)

Como no puede evitar que SQS envíe mensajes duplicados, debe implementar esto de su lado. Una forma sencilla de hacerlo es utilizar los consumidores idempotentes de Apache Camel, ver http://camel.apache.org/idempotent-consumer.html

¿Cuál es la mejor manera de evitar mensajes duplicados en Amazon SQS? Tengo un SQS de dominios esperando ser rastreado. antes de agregar un nuevo dominio al SQS puedo verificar con los datos guardados para ver si se ha rastreado recientemente, para evitar duplicados.

El problema es con los dominios que aún no se han rastreado. Por ejemplo, si hay 1000 dominios en la cola que no se han rastreado. Cualquiera de esos enlaces podría agregarse nuevamente, y una y otra vez. Lo que aumenta mi SQS a cientos de miles de mensajes que en su mayoría son duplicados.

¿Cómo evito esto? ¿Hay alguna manera de eliminar todos los duplicados de una cola? ¿O hay una forma de buscar un mensaje en la cola antes de agregarlo? Siento que este es un problema que cualquier persona con un SQS debe haber experimentado.

Una opción que puedo ver es si almaceno algunos datos antes de que el dominio se agregue al SQS. Pero si tengo que almacenar los datos dos veces, eso arruina el punto de usar un SQS en primer lugar.


Como se menciona en las otras respuestas, no puede evitar que los mensajes duplicados provengan de SQS.

La mayoría de las veces sus mensajes serán entregados a uno de sus consumidores una vez, pero se encontrará con duplicados en algún momento.

No creo que haya una respuesta fácil a esta pregunta, porque implica crear una arquitectura adecuada que pueda hacer frente a los duplicados, lo que significa que es idempotente en la naturaleza.

Si todos los trabajadores de su arquitectura distribuida fueran idempotentes, sería fácil, porque no tendría que preocuparse por los duplicados. Pero en realidad, ese tipo de entorno no existe, en algún punto del camino algo no será capaz de manejarlo.

Actualmente estoy trabajando en un proyecto en el que se me exige que resuelva esto, y propongo un enfoque para manejarlo. Pensé que podría ser beneficioso para otros compartir mi pensamiento aquí. Y podría ser un buen lugar para obtener algunos comentarios sobre mi forma de pensar.

Hecho de la tienda

Es una buena idea desarrollar servicios para que recopilen hechos que teóricamente puedan reproducirse para reproducir el mismo estado en todos los sistemas descendentes afectados.

Por ejemplo, supongamos que está creando un intermediario de mensajes para una plataforma de negociación de acciones. ( De hecho, he trabajado en un proyecto como este antes, fue horrible, pero también una buena experiencia de aprendizaje ) .

Ahora digamos que los comercios entran, y hay 3 sistemas interesados ​​en él:

  1. Un mainframe de la vieja escuela que necesita mantenerse actualizado
  2. Un sistema que recopila todos los intercambios y lo comparte con los socios en un servidor FTP
  3. El servicio que registra el comercio y reasigna acciones al nuevo propietario

Es un poco intrincado, lo sé, pero la idea es que un mensaje (hecho) que entra, tenga varios efectos descendentes distribuidos.

Ahora imaginemos que mantenemos una tienda de datos, una grabación de todos los comercios que entran en nuestro corredor. Y que los 3 propietarios de servicios posteriores nos llaman para decirnos que han perdido todos sus datos de los últimos 3 días. La descarga del FTP está 3 días atrás, el mainframe tiene 3 días de retraso y todos los intercambios tienen 3 días de retraso.

Debido a que tenemos la tienda de hechos, teóricamente podríamos reproducir todos estos mensajes de un tiempo determinado a un tiempo determinado. En nuestro ejemplo, eso sería desde hace 3 días hasta ahora. Y los servicios descendentes podrían ponerse al día.

Este ejemplo puede parecer un poco exagerado, pero trato de transmitir algo muy particular: los hechos son las cosas importantes que hay que tener en cuenta, porque allí es donde vamos a usar en nuestra arquitectura para luchar contra los duplicados.

Cómo la tienda de hechos nos ayuda con los mensajes duplicados

Siempre que implemente su almacén de datos en un nivel de persistencia que le proporcione las partes CA del teorema , consistencia y disponibilidad de CAP , puede hacer lo siguiente:

Tan pronto como se recibe un mensaje de una cola, comprueba en su tienda de datos si ya ha visto este mensaje antes, y si lo tiene, si está bloqueado en este momento, y en un estado pendiente. En mi caso, usaré MongoDB para implementar mi tienda de datos, ya que me siento muy cómodo con ella, pero varias otras tecnologías de bases de datos deberían ser capaces de manejar esto.

Si el hecho no existe aún, se inserta en el almacén de datos, con un estado pendiente y un tiempo de vencimiento del bloqueo. Esto se debe hacer usando operaciones atómicas, ¡porque no quieres que esto suceda dos veces! Aquí es donde se asegura la idempotence su servicio.

Feliz caso - pasa la mayor parte del tiempo

Cuando el almacén de datos vuelve a su servicio informándole que el hecho no existía y que se había creado un bloqueo, el servicio intenta hacer su trabajo. Una vez hecho, borra el mensaje SQS y marca el hecho como completado.

Mensaje duplicado

Entonces, eso es lo que sucede cuando llega un mensaje y no es un duplicado. Pero veamos cuando aparece un mensaje duplicado. El servicio lo recoge y le pide a la tienda de datos que lo grabe con un candado. El almacén de hechos le dice que ya existe y que está bloqueado. ¡El servicio ignora el mensaje y se salta el mensaje! Una vez que el otro trabajador haya procesado el mensaje, eliminará este mensaje de la cola y no lo veremos nuevamente.

Caso de desastre: ocurre rara vez

Entonces, ¿qué sucede cuando un servicio registra el hecho por primera vez en la tienda, luego obtiene un bloqueo por un cierto período, pero se cae? Bien, SQS le presentará un mensaje de nuevo, si fue recogido, pero no eliminado dentro de un cierto período después de ser servido desde la cola. Es por eso que codificamos nuestra tienda de datos de manera que un servicio mantiene un bloqueo por un tiempo limitado. Porque si se cae, queremos que SQS presente el mensaje al servicio u otra instancia del mismo en un momento posterior, permitiendo que ese servicio suponga que el hecho debe incorporarse nuevamente al estado (ejecutado).


No hay una forma de nivel de API para evitar que los mensajes duplicados se publiquen en una cola de SQS. Debería manejar esto en el nivel de aplicación, me temo.

Puede usar una tabla DynamoDB para almacenar los Nombres de dominio que esperan ser rastreados y solo agregarlos a la cola si no están en DynamoDB, por ejemplo.


Según AWS Docs, el Exactly-Once Processing proporciona una forma de evitar los mensajes duplicados.

A diferencia de las colas estándar, las colas FIFO no introducen mensajes duplicados. Las colas FIFO lo ayudan a evitar enviar duplicados a una cola. Si vuelve a intentar la acción SendMessage dentro del intervalo de deduplicación de 5 minutos, Amazon SQS no introduce ningún duplicado en la cola.

Si su cola es una cola FIFO y ha habilitado la duplicación basada en el contenido, esta función puede utilizarse para evitar mensajes duplicados durante el intervalo de deduplicación. Para más información, lea esta section y el siguiente enlace.

docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…