Ich muss eine Warteschlange für die Verarbeitung erstellen. Die Warteschlange selbst hat ein relativ geringes Volumen. Möglicherweise werden pro Stunde etwa 1.000 Schreibvorgänge ausgeführt. Die Ausführung jeder Aufgabe kann jeweils etwa eine Minute dauern und wird fast verarbeitet, sobald das Element zur Warteschlange hinzugefügt wird.
Gibt es einen Grund, warum ich RabbitMQ anstelle von Standardprodukten wie Amazon SQS implementieren möchte? Was sind einige Gründe, warum eine Anwendung anstelle von SQS ein eigenes Warteschlangensystem benötigen würde?
amazon-web-services
rabbitmq
amazon-sqs
David542
quelle
quelle
Antworten:
Zunächst einmal ist Amazon SQS eine Pseudo-Warteschlange, was bedeutet, dass die Zustellung jeder Nachricht (wenn sie die Warteschlange erreicht) garantiert ist, jedoch nicht auf FIFO-Weise, wie dies normalerweise in einer Warteschlange geschieht.
Wenn die Reihenfolge der Nachrichten für Sie wichtig ist und Sie möchten, dass die Warteschlange FIFO-artig funktioniert, wird in der Amazon SQS-Dokumentation angegeben, dass dies in Ihrer Anwendungslogik behandelt werden soll, da die Nachrichten von Amazon SQS Sie außerhalb der Reihenfolge erreichen.
Im Vergleich dazu können Sie meines Wissens Worker-Warteschlangen in RabbitMQ implementieren. Wenn Sie dadurch die Sequenzierung von Warteschlangennachrichten auf Anwendungsebene nicht implementieren können, ist dies eine vorzuziehende Option.
Hier sind einige Faktoren, die Ihnen bei der Entscheidung helfen, für welche Sie sich entscheiden sollten:
Warteschlangennachrichtenfolge wie oben erwähnt.
Sie können Ihren eigenen Server mit RabbitMQ einrichten, jedoch nicht mit Amazon SQS, sodass die Kosten hier anfallen.
Das Einrichten eines eigenen Servers erfordert gute Kenntnisse des Themas, damit Sie keine Ecke unberührt lassen. Dies ist bei Amazon SQS nicht der Fall, da der Einstieg ziemlich schnell ist.
Ihr eigener RabbitMQ-Server bedeutet Wartungskosten auf der ganzen Linie, was bei Amazon SQS nicht der Fall ist.
Aktualisierung:
quelle
SQS wäre meine Präferenz gegenüber RabbitMQ, hier ist der Grund.
RabbitMQ bietet jedoch möglicherweise schnellere Antwortzeiten für Puts und Get, normalerweise in Zehntausenden von TPS aus meinen Tests. Damit SQS diese Art von Durchsatz bietet, müssen Sie mit mehreren Instanzen horizontal skalieren. Wenn Sie also nach Puts unter 5 ms suchen, ist RabbitMQ möglicherweise eine Option, die Sie in Betracht ziehen sollten, da ich bei meinen SQS-Tests bei 1000 s TPS eine Put-Zeit von fast 20 ms bis 30 ms gesehen habe, was etwas höher ist als bei RabbitMQ.
Wir haben gerade unsere Messaging-Infrastruktur von ActiveMQ auf SQS verlagert und können nicht zufriedener sein. Wir haben festgestellt, dass dies billiger ist als die Wartung unseres eigenen ActiveMQ-Clusters in der Cloud.
Hoffe das hilft! Lassen Sie uns wissen, wie es geht ..
quelle
Ich habe tatsächlich beide in einem kommerziellen Umfeld mit vernünftigen verwendet.
Die kurze Antwort lautet: Wenn es keine bestimmten Eckfälle gibt, ist es besser, mit AWS SQS zu arbeiten. (Sie können für eine einfache Zusammenfassung nach unten springen)
Codierung (Krawatte): RabbitMQ und AWS SQS haben beide etablierte Bibliotheken und viele Beispiele.
Sichtbarkeitszeitlimit (SQS): Eine Sache, die SQS gegenüber RabbitMQ bietet, ist ein umfassenderer Begriff des Sichtbarkeitszeitlimits. Wenn in RabbitMQ ein Verbraucher stirbt, bevor er bestätigt, werden die Nachrichten wieder in die Warteschlange gestellt. SQS hat jedoch einen umfassenderen Begriff für das Sichtbarkeitszeitlimit, der nicht an einen bestimmten Anrufer gebunden ist. So können Sie eine Arbeitseinheit starten, die Sichtbarkeit mit einer großen Zeitüberschreitung (bis zu 12 Stunden) einstellen, die Verbindung trennen, einen anderen Mitarbeiter fertig stellen und bestätigen. In meinem Design nutzen wir dies umfassend und eliminieren zusätzlichen Service / Speicher, um potenziell große Nutzdaten in Bearbeitung zu verwalten.
Umgang mit toten Briefen (RabbitMQ - von einem 'Hasen') SQS bietet eine grundlegende Übergabe von toten Briefen in der sogenannten "Re-Drive-Richtlinie", mit der Nachrichten in die Warteschlange für tote Briefe (nur eine weitere Warteschlange) gestellt werden. Es ist einfach und hat nur eine Vorstellung von der Anzahl der Nachrichten. RabbitMQ verfügt über Dead Letter Exchanges, die Nachrichten bereitstellen, die nach Ablauf in DLE verschoben werden. Dies ist jedoch eine Art Streitpunkt, da die Idee "Wenn Sie nicht sehen, dass Ihre Dienste und Nachrichten ablaufen, landet sie im DLE". Es ist ein kleiner Gewinn für RabbitMQ, da ich dieses Argument als kontraintuitiv empfinde. Warum sollten Sie Ihre Warteschlange und nicht Ihre Dienste überwachen? (Wenn überhaupt, ist es umgekehrt)
Administration (SQS): Es gibt keine Administration für SQS. Sie zahlen nur für API-Aufrufe. Alle üblichen Probleme wie OS / App-Sicherheitspatches, Skalierung (Hinzufügen weiterer Knoten) und Festplatte werden von AWS-Teams behandelt. Es ist auch FedRamp-konform (für die Verwendung durch die Regierung). Es ist wirklich ein "Setup and Forget" -System. Während RabbitMQ übliche Betriebssystem- / Service-Patches, AMIs, Clustering, Sicherheitshärtung usw. erfordert. Obwohl dies äußerst selten vorkommt, können AMIs ausfallen oder manchmal verschoben werden, sodass Clustering sofort erforderlich ist. SQS beseitigt all diese Kopfschmerzen.
KOSTEN (SQS): Ein einzelner SQS-API-Aufruf kann "Stapel mit bis zu 10 Nachrichten / 256 KB Größe" enthalten, und "lange Abfragen" können die Kosten drastisch senken. Darüber hinaus gibt es Strategien wie die Nachrichtenkomprimierung, mit denen Dutzende (einige behaupten Hunderte oder mehr) von Nachrichten in einer einzigen Nutzlast gesendet werden können, um die Kosten weiter zu senken. Und dies ist, bevor wir uns überlegen, wie viel Zeit die Leute damit verbringen, Probleme zu überwachen / zu patchen / zu beheben. SQS eignet sich auch hervorragend für "POC-Projekte", als ob es im Leerlauf wäre und keine Kosten entstehen.
FIFO (TIE): Im Jahr 2016 führte AWS die FIFO-Unterstützung gegen eine zusätzliche Gebühr von ~ 0,01 USD / Million API-Aufrufe ein (0,05 USD gegenüber 0,04 USD pro Million API-Alls - vor Rabatten). Sie können wählen, ob Sie FIFO verwenden möchten oder nicht. Bei Nicht-FIFO werden selten doppelte Nachrichten angezeigt.
Speicher (SQS): AWS erhebt keine Gebühren für den Speicher, Sie haben jedoch ein Limit von 14 Tagen. In RabbitMQ müssen Sie Speicherplatz zuweisen, erweitern und verwalten, für den eine maximale Speicherkapazität sowie zusätzliche Puffer erforderlich sind. Es sind nur mehr Kopfschmerzen.
Metriken (SQS): SQS bietet sofort einsatzbereite Metriken. Und während Sie sie zu AWS hinzufügen könnten, ist es nur mehr Arbeit.
Lokale Entwickler (Krawatte): Die meisten modernen Geschäfte bevorzugen eine lokale Umgebung. Es gibt verschiedene Optionen, mit denen Docker von RabbitMQ und SQS jetzt zugelassen werden.
Hoher Durchsatz / sehr große Nachricht (RabbitMQ - Art) Wenn Sie SQS> 1000 Anforderungen / Sek. Drücken, steigt die Latenz von SQS. Es gibt verschiedene Strategien, um dies zu umgehen. Ich finde diese Fälle jedoch äußerst selten, da die meisten Arbeiten in mehrere Warteschlangen aufgeteilt werden können. Aber für diese Art von Fällen, in denen 100k / s erforderlich sind, denke ich, dass Kafka besser ist. (Wir verwenden Kafka auch bei meiner Arbeit.) Es ist selten, dass eine einzelne Arbeitseinheit 1000+ Anforderungen / Sekunde mit geringer Latenz erfordert. * Weitere Erklärungen finden Sie weiter unten
Zusammenfassung: Wenn Sie in AWS sind und bereit sind, mit SQS verheiratet zu sein, ist SQS ein Kinderspiel. Aber Sie sollten weiterlesen, da es wichtige Dinge zu beachten gibt.
Die klassische Strategie für RabbitMQ (und andere Warteschlangen) besteht darin, verschiedene Arten von Warteschlangen zu erstellen, die für bestimmte Arbeitstypen optimiert sind. Optimieren Sie dann jede dieser Warteschlangen und gruppieren Sie ähnliche Arbeiten in einer kleinen Anzahl dieser (oft sehr großen) Warteschlangen. Da SQS keinen Verwaltungsaufwand hat, ist es eigentlich besser, jeder Arbeit eine dedizierte Warteschlange zuzuweisen. Auf diese Weise wird eine Skalierung ermöglicht, aber auch eine Warteschlangensättigung (störende Arbeit, die die Warteschlange überfüllt und andere Mitarbeiter übertönt), eine bessere Sicht auf die Arbeit (Standardmetriken) usw. beseitigt.
Die neue Strategie hat es meinen Teams ermöglicht, die Verteilung der Arbeit besser zu sehen. Vorbei sind die Zeiten, in denen die Instanz für mehr Last aktualisiert wurde. In der Vergangenheit haben wir eine große unerklärliche Spitze gesehen, die Nebenwirkungen für andere Dienste verursacht oder nur vermutet hat, dass die kumulierten Zahlen ungefähr richtig aussehen. “ Nachdem der Verkehr getrennt wurde, haben wir tatsächlich viele Probleme aufgedeckt, die zuvor unbemerkt blieben, und können klar erklären, wie viel Verkehr wohin fließt. Und während es sehr gut möglich ist, Metriken und Tools zu implementieren, bietet SQS all dies sofort.
Es gibt immer noch gute Fälle, in denen RabbitMQ ernsthaft in Betracht gezogen werden sollte
quelle
Wenn Sie kostenempfindlich sind, ist Amazon SQS wahrscheinlich teurer. Ich sage wahrscheinlich, weil Sie Ihren RabbitMQ-Server noch irgendwo hosten müssen. SQS gibt Ihnen Ihre ersten Millionen Anfragen kostenlos und berechnet danach 0,4 USD pro Million Anfragen. Es gibt einen Trick, um Ihre Kosten mit SQS zu senken, indem Sie lange Abfragen aktivieren, dh Ihre Receive_message_wait_time auf 20s setzen. Dies bedeutet nicht, dass Ihre Nachrichten nur alle 20 Sekunden gesendet werden, sondern dass SQS Ihnen keine "Anfrage" berechnet, wenn Ihre Warteschlange leer ist (alle 20 Sekunden).
Wenn Sie 1000 Anfragen pro Stunde verwenden, sehen Sie 744000 pro Monat. Frei innerhalb der freien Stufe und ungefähr 0,74 * $ 0,4 = $ 0,2976 außerhalb der Stufe. Was Sie wahrscheinlich weiter reduzieren könnten, indem Sie die Wartezeit aktivieren. In Ihrem Fall kann SQS also tatsächlich günstiger sein, da die meisten Hosting-Angebote ab einem Mindestbetrag von 5 USD beginnen (es sei denn, Sie haben eine kostenlose EC2-Stufe von AWS). Sie sollten mit der kleinsten Option in Ordnung sein, da RMQ nur einen Start von ca. 128 MB RAM empfiehlt.
Ich finde SQS viel benutzerfreundlicher und RabbitMQ viel technischer, wenn Sie so geneigt sind.
Aktualisieren:
Ich fand AWS Simple Notification Service tatsächlich besser geeignet für das, was ich brauchte: https://stackoverflow.com/a/13692720/5403449, hauptsächlich, weil es Push-basiert ist , dh nicht abfragt
quelle