Wie kann eine gerechte Verteilung von SQS-Nachrichten in einer verteilten Systemeinstellung sichergestellt werden?

7

Ich habe mehrere Server, von denen jeder ein Skript hat, das eine SQS-Warteschlange abfragt [alle fragen dieselbe Warteschlange ab].

Gibt es also eine Möglichkeit, eine gerechte Verteilung von Nachrichten an alle diese Clients [dh meine Arbeitsserver hier] sicherzustellen? Wenn sich beispielsweise 100 Nachrichten in der Warteschlange 20-20-20-20-20befinden, 5 Mitarbeiter und so weiter.

Kann mir AWS ELB (Elastic Load Balancer) dabei helfen? Wenn ja, wie dann? Wenn nicht, gibt es dann einen alternativen Service im AWS-Ökosystem, der mir dabei helfen kann?

Oder überdenke ich das? Ich meine, kann dies im Abfrageskript einfach gelöst werden? [Bitte beachten Sie die Rennbedingungen, da mehrere Clients eine einzelne Warteschlange abfragen.]

Dawny33
quelle
3
Vielleicht verwandt : D
Tensibai

Antworten:

6

Wenn sich 100 Nachrichten in der Warteschlange und 5 Verbraucher befinden, beträgt die anfängliche Verteilung nicht mehr als 10-10-10-10-10.

Eine einzelne Antwort kann niemals mehr als 10 Nachrichten zurückgeben .

Dies scheint kein Problem zu sein.

Rennbedingungen, die sich auf mehrere Verbraucher beziehen, sollten ebenfalls kein Problem sein. SQS wurde für mehrere gleichzeitige Verbraucher entwickelt.

Verwenden Sie lange Umfragen und einen Wartezeitraum von maximal 20 Sekunden und lassen Sie sich überraschen. (Nein, eine Wartezeit von 20 Sekunden verzögert Nachrichten nicht um 20 Sekunden. Sie verzögert sie überhaupt nicht. Sie müssen sie in Aktion sehen, um wirklich zu verstehen, wie sie funktioniert.)

Sie überdenken definitiv einige Dinge, vermute ich.

Michael - sqlbot
quelle
3

Eine gute Architektur bei der Verwendung von SQS-Warteschlangen löst Ihre Probleme. Wenn wir davon ausgehen, dass pro Nachricht beispielsweise 3 Minuten verarbeitet werden, können Sie eine nahezu gleichmäßige Verteilung der Nachrichten gewährleisten, da diese im Vergleich zu der zum Abfragen der Warteschlange erforderlichen Zeit sehr groß ist, wenn Sie die Nachricht erst danach aus der Warteschlange löschen es wurde verarbeitet.

Beachten Sie, dass für jede SQS-Nachricht ein Sichtbarkeitszeitlimit von 12 Stunden gilt. Wenn Sie sie bis dahin nicht löschen, wird sie erneut in der Warteschlange angezeigt. Ich vermute, dass dies wahrscheinlich keine Einschränkung für Sie ist, aber denken Sie daran.

Henry
quelle
3

Lange Abfragen sind immer von Vorteil, da sie in den meisten Anwendungsfällen zu einer höheren Leistung bei reduzierten Kosten führen. Leider können Sie die Anzahl der Nachrichten, die jeder Mitarbeiter aus der Warteschlange empfängt, aufgrund der verteilten Natur der Warteschlange nicht steuern. Es gibt jedoch einige clientseitige Problemumgehungen, die Ihnen beim Ausgleich der Last für die Mitarbeiter helfen können.

Das haben wir als Workaround dafür getan:

Als eine der Problemumgehungen kann das Poller-Skript die Anzahl der Nachrichten steuern, die jeder Mitarbeiter erhält. Es kann ein Schwellenwert für die maximale Anzahl von Nachrichten festgelegt werden, die jeder Mitarbeiter verarbeiten kann. Dieser Schwellenwert kann ein dynamischer Wert sein und wird wahrscheinlich ApproximateNumberOfMessagesVisibledurch die Anzahl der Poller / Poller-Skripte geteilt. Sie können dann das Sichtbarkeitszeitlimit auf einen niedrigeren Wert beschränken. Wenn also alle Poller-Skripte gleichzeitig lange abfragen, greift einer der Poller auf die Nachricht zu und entscheidet, dass sie basierend auf dem Schwellenwert überlastet ist. Löscht die Nachricht nicht, die Nachricht kehrt zur Warteschlange zurück und kann von anderen Meinungsforschern abgerufen werden, die noch die Fähigkeit haben, die Nachricht abzurufen. Der Schwellenwertparameter kann genau an die Anforderungen der Anwendung angepasst werden.


Ein Failover-Mechanismus würde ebenfalls hilfreich sein, beispielsweise wie die Antworten in diesem Beitrag beschreiben . Ich kann es mir jedoch nicht leisten, Failover-Warteschlangen in einer verteilten Architektur zu haben, da dies die Komplexität erhöhen würde. Die obige Problemumgehung war also eine bessere Idee für mein Team.

Dawny33
quelle