2015-01-23 21 views
7

Diciamo che ho 100 thread che leggono dagli stessi sq - è garantito che ogni messaggio verrà consegnato al massimo una volta? È possibile consegnare lo stesso messaggio più di una volta? Non riesco a trovare alcuna documentazione chiara su questo problema. sSQS che consegna un messaggio solo una volta

risposta

13

aggiornamento Nov 17, 2016:FIFO queueing with guaranteed-once delivery è stato appena pubblicato oggi (quasi 2 anni dopo questa risposta originariamente pubblicato) e SQS ora supporta esattamente-tempo di consegna. Ecco i dettagli:

  • È necessario creare un FIFO Queue.
  • Il controllo di deduplicazione per MessageDeduplicationId come attributo del messaggio di coda e impedisce l'invio e la ricezione di messaggi duplicati nell'intervallo di deduplicazione di 5 minuti che segue l'azione controllando lo MessageDeduplicationId.
  • Se la deduplicazione basata sul contenuto è abilitata esplicitamente nella coda FIFO, MessageDeduplicationId verrà generata automaticamente utilizzando un hash SHA-256 del corpo del messaggio (solo contenuto, non attributi).
  • Se la deduplicazione basata sul contenuto non è abilitata, è necessario impostare in modo esplicito il proprio valore arbitrario per MessageDeduplicationId in fase di invio. Altrimenti SendMessage fallirà con un errore.

La deduplicazione basata su contenuto può essere abilitata quando creating a queue o updating the queue' attributes.

Ulteriori dettagli su MessageDeduplicationId nella documentazione SendMessage e ReceiveMessage.


Dopo Nov 17, 2016, questo vale ancora di standard (non-FIFO) code:

A causa della natura distribuita delle code standard (non-FIFO) in SQS, la garanzia è invece "almeno" una volta.

Dal FAQ:

D: Quante volte riceverò ogni messaggio?

Amazon SQS è progettato per fornire "almeno una volta" la consegna di tutti i messaggi nelle sue code. Sebbene il più delle volte ciascun messaggio sia consegnato alla tua applicazione esattamente una volta, dovresti progettare il tuo sistema in modo che l'elaborazione di un messaggio più di una volta non crei errori o incoerenze.

Maggiori informazioni sul at least once consegna:

Amazon SQS memorizza copie dei messaggi su più server per la ridondanza e alta disponibilità. In rare occasioni, uno dei server che memorizza una copia di un messaggio potrebbe non essere disponibile quando si riceve o elimina il messaggio. Se ciò si verifica, la copia del messaggio non verrà eliminata su quel server non disponibile e potresti ricevere di nuovo quel messaggio quando si ricevono messaggi. Per questo motivo, è necessario progettare la propria applicazione come idempotent (vale a dire, non deve essere influenzata negativamente se elabora lo stesso messaggio più di una volta).

Se avete veramente bisogno di garantire "al massimo una volta" trattamento nell'applicazione, si potrebbe voler controllare l'applicazione per gli ID dei messaggi unique identifiers of SQS messages e non di processo che si è elaborata prima, o sono in fase di elaborazione.

+0

La domanda più grande è se questo può accadere in un periodo di tempo molto breve. Significato, Thread 1 e Thread 2 possono ricevere lo stesso messaggio entro un secondo di ogni richiesta. Questo è quello che non ho potuto trovare nella documentazione. Ho accettato la risposta in entrambi i modi, poiché si avvicina a quello che stavo cercando. – Vladimir

+0

Certo, c'è un'altra domanda che ha chiesto esattamente: http://stackoverflow.com/questions/28130677/time-period-between-duplicate-messages –

+0

Come faccio a sapere se un lavoro è attualmente in fase di elaborazione? –

Problemi correlati