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
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 loMessageDeduplicationId
. - 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.
- 1. Rilasciare un messaggio a SQS
- 2. SMS Android Messaggio messaggio di consegna intento
- 3. elaborazione di un messaggio esattamente una volta
- 4. Registrazione Python: messaggio di stampa solo una volta
- 5. jQuery - Solo una volta
- 6. Amazon SNS -> corpo del messaggio SQS
- 7. Come limitare un flusso Akka per eseguire e inviare un messaggio solo una volta al secondo?
- 8. Attivare un evento solo una volta?
- 9. .replaceWith() funziona solo una volta
- 10. view.getDrawingCache() funziona solo una volta
- 11. Esegui setUp solo una volta
- 12. I2C onReceive-handler chiamato solo una volta
- 13. onPreviewframe chiamato solo una volta
- 14. AS3 - Listener di eventi che si attiva solo una volta
- 15. python - assicurarsi che lo script sia attivato solo una volta
- 16. Android RX - Observable.timer che si attiva solo una volta
- 17. numero che si verifica solo una volta nella matrice
- 18. Assicurarsi che NHibernate SessionFactory sia creato solo una volta
- 19. Chiamare una funzione solo una volta
- 20. Solo un thread alla volta!
- 21. Sostituire un elemento in un elenco solo una volta - Haskell
- 22. Knockout afterRender, ma solo una volta
- 23. setInterval - Come sparare solo una volta?
- 24. log4net GlobalContext.Properties impostato solo una volta
- 25. jQuery perché: hover funziona solo una volta?
- 26. Android - Ottieni posizione solo una volta
- 27. python: smtp con TLS non consegna alcun messaggio
- 28. MySQL: emettere solo alcuni valori una volta
- 29. UIWebView dovrebbeStartLoadWithRequest chiamato solo una volta?
- 30. srand() - perché chiamarlo solo una volta?
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
Certo, c'è un'altra domanda che ha chiesto esattamente: http://stackoverflow.com/questions/28130677/time-period-between-duplicate-messages –
Come faccio a sapere se un lavoro è attualmente in fase di elaborazione? –