2017-07-04 4 views
1

Ich habe eine FIFO-SQS-Warteschlange, mit Sichtbarkeitszeit von 30 Sekunden. Die Anforderung besteht darin, Nachrichten so schnell wie möglich zu lesen und die Warteschlange zu löschen.Amazon SQS - FIFO Warteschlange Nachricht Anfrage, inkonsistent empfängt

Ich habe Code in JAVA in einer Art und Weise unten (dies nur nur eine Darstellung der Idee, nicht vollständiger Code):

//keep getting messages from FIFO and process them ASAP 
while(true) 
{ 
    List<Message> messages = 
    sqsclient.receiveMessage(receiveMessageRequest).getMessages(); 
    //my logic/code here to process these messages and delete them ASAP 
} 

In der while-Schleife, sobald die Nachrichten empfangen werden, Sie werden verarbeitet und aus der Warteschlange entfernt. Aber, viele Male die receiveMessageRequest gibt mir keine Nachrichten (gibt keine Nachrichten zurück).

Auch die Nachrichten Begrenzung ist nur 10 zu einem Zeitpunkt während des Empfangs von SQS, die bereits ein Problem ist, aber aufgrund dieser Null empfängt, häufen sich die Warteschlangen.

Ich habe keine Ahnung, warum das passiert. Die Dokumentation ist genau hier nicht klar (oder fehle ich in Bezug auf die Konfiguration der Warteschlange?)

Bitte helfen!

Hinweis: 1. Meine FIFO-Warteschlange hat immer Nachrichten in diesem Szenario, so gibt es keinen Fall von Queue Null-Nachrichten mit und Anforderung empfangen Null

2. Die Verarbeitung der Rückkehr und löschen Zeiten auch sind Weniger als das Sichtbarkeits-Timeout.

Danke.

Update: ich für die Verarbeitung der FIFO-Warteschlange mehrere Verbraucher laufen begonnen haben. Es ist klar, dass ein Verbraucher den Zustrom von Nachrichten nicht bewältigt. Ich werde in wenigen Tagen aktualisieren, wie sich mehrere Verbraucher verhalten. Danke

+0

Haben Sie darüber nachgedacht, mehrere Threads/Clients zu verwenden, um Nachrichten parallel zu verarbeiten? Könnten Sie das Limit von 300 Transaktionen pro Sekunde (TPS) für FIFO-Warteschlangen erreichen? Haben Sie in Erwägung gezogen, ** langes Polling ** (Nachrichtenwartezeit empfangen) zu verwenden, das nach einer bestimmten Zeit (z. B. 20 Sekunden) nur eine Antwort mit einer Nullnachricht zurückgibt? –

+0

@John Danke für die Antwort. Ja. Ich habe lange Polling versucht, ähnliches Verhalten. Es erhält nicht immer Nachrichten, selbst wenn die Warteschlange mehr als 5000 Nachrichten enthält. Ich versuche gerade mehrere Verbraucher. Aber ich wollte das Verhalten im Allgemeinen verstehen –

+0

Wie viele Nachrichten werden derzeit als ** im Flug ** angezeigt?Eine FIFO-Warteschlange erfordert, dass Sie jede Nachricht korrekt behandeln, und wenn Sie dies nicht tun, werden sie "im Flug" angezeigt. SQS wartet darauf, dass Sie auf sie reagieren oder dass ihre Sichtbarkeitszeit abgelaufen ist. Überprüfen Sie dies? –

Antwort

0

Sie müssen zuerst sicherstellen, dass alle Nachrichten, die Sie erhalten, in VisibilityTimeout gelöscht werden. Wenn Sie zum Löschen DeleteMessageBatch verwenden, stellen Sie sicher, dass alle 10 Nachrichten gelöscht sind.

Wie haben Sie auch Nachrichten in Warteschlangen eingereiht? Reihenfolge der Nachrichten sind nur in einer einzigen Nachrichtengruppe garantiert. Dies bedeutet auch, dass wenn Sie die gleiche Gruppen-ID für alle Nachrichten festlegen, Sie auf einen einzelnen Verbraucher beschränkt sind, damit die Reihenfolge der Nachrichten sicher erhalten bleibt. Auch wenn mehrere Benutzer verwendet werden, sind alle Nachrichten, die zu derselben Gruppe gehören, für andere Benutzer unsichtbar, bis das Zeitlimit für die Sichtbarkeit abgelaufen ist.

Verwandte Themen