SQS gegen RabbitMQ

82

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?

David542
quelle
1000 Schreibvorgänge pro Stunde sind in Ordnung. Wenn Sie Zeit und genügend Wissen haben, führen Sie die RabbitMq-Instanz selbst aus. Im Vergleich zum Amazon SQS-Dienst sparen Sie außerdem Geld. Für SQS war es einfach da. Es war bequem, einfach und relativ schnell zu codieren.
BMW
Mit SQS erhalten Sie die Erweiterbarkeit und Skalierbarkeit von Lambda-Triggern.
Donato

Antworten:

94

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:

  1. Warteschlangennachrichtenfolge wie oben erwähnt.

  2. Sie können Ihren eigenen Server mit RabbitMQ einrichten, jedoch nicht mit Amazon SQS, sodass die Kosten hier anfallen.

  3. 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.

  4. Ihr eigener RabbitMQ-Server bedeutet Wartungskosten auf der ganzen Linie, was bei Amazon SQS nicht der Fall ist.

Aktualisierung:

  1. Amazon SQS unterstützt jetzt FIFO-Warteschlangen.
Noman Ur Rehman
quelle
5
Was meinen Sie mit "Amazon SQS hat eine breite Portabilität mit fast allen wichtigen Plattformen, nicht sicher, ob dies bei RabbitMQ der Fall ist". RabbitMQ läuft auf allen wichtigen Plattformen (Windows, Linux und Mac) sowie in allen wichtigen Sprachen (Java, .Net, PHP, Python, Ruby usw.)
old_sound
6
@old_sound Der Unterschied besteht darin, dass beim Ausführen von SQS, das Sie nur für die Nutzung (Senden und Empfangen von Nachrichten) bezahlen, während Sie RabbitMQ ausführen, die versteckten Kosten (über der EC2-Nutzung) anfallen, um sicherzustellen, dass der Dienst ausgeführt, überwacht und gepatcht wird, einschließlich der App und des Basiswerts Betriebssystem. Mit SQS kümmert sich AWS um all das "undifferenzierte schwere Heben", sodass Sie sich einfach auf Ihre App konzentrieren können.
JaredHatfield
27
Amazon SQS unterstützt jetzt FIFO
Rocketspacer
6
Bitte aktualisieren Sie den oberen Teil des Beitrags, um zu zeigen, dass er jetzt FIFO-Warteschlangen unterstützt. Ich habe fast aufgehört zu lesen, als ich das gelesen habe
andy mccullough
11
-1 Diese Antwort braucht wirklich etwas Aufmerksamkeit, um nützlich zu sein. Vorschläge: Entfernen Sie die FIFO-Einschränkung vollständig, konzentrieren Sie sich auf IaaS - Skalierung, Konfiguration usw. - und Unterschiede bei der Nachrichtenübermittlung (z. B. Abfrage).
Brett
68

SQS wäre meine Präferenz gegenüber RabbitMQ, hier ist der Grund.

  1. SQS ist ein verwalteter Dienst. Sie müssen sich also keine Gedanken über betriebliche Aspekte beim Ausführen eines Messagingsystems machen, einschließlich Verwaltung, Sicherheit, Überwachung usw. Amazon übernimmt dies für Sie und bietet Support, falls etwas schief gehen sollte.
  2. SQS ist elastisch und kann auf sehr große Raten / Volumina skaliert werden (unbegrenzt laut AWS;))
  3. Die Verfügbarkeit von SQS enthält viele Neuner und wird von Amazon unterstützt. Dies ist eine Sache weniger, über die Sie sich in Ihrer Anwendung Sorgen machen müssen.

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 ..

ssekhar
quelle
@ssekhar Wir planen auch, activemq auf SES zu migrieren. Wie groß sind die Änderungen auf Client-Seite? Wir sind auf Java und der neuesten Version von activemq.
Deepak Singhal
Ich verwende seit Jahren SQS-basierte Apps mit einer mittleren Put-Latenz von etwa 7 ms pro Put. Wenn Sie 20 bis 30 ms erhalten, stimmt etwas schrecklich nicht, entweder bei Ihrer Messung oder bei Ihrem Test. Laufen Sie aus derselben AWS-Region / AZ? Wie messen Sie?
Krease
1
@DeepakSinghal - Ich bin sicher, dass Sie die Antwort auf Ihre Frage wahrscheinlich bereits gefunden haben. Tut mir leid, dass ich ein paar Jahre zu spät komme, um die Frage hier zu beantworten :). Wechsel von ActiveMQ zu SQS - Hier sind einige Herausforderungen, mit denen wir uns befassen mussten. 1) SQS bietet eine mindestens einmalige Zustellgarantie im Vergleich zu einmal und nur einmal wie JMS. Daher mussten wir nach doppelter Zustellung suchen (unser hier gezeigter Ansatz -> angularthinking.blogspot.com ). 2) SQS verwendet ein Pull-Muster im Vergleich zu. Push in die Clients wie in JMS, was den Verbrauch erleichtert. Wir haben unseren eigenen Listener und Async Delivery-Prozessor auf unserem implementiert, um die Entwicklung zu vereinfachen.
Ssekhar
21

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

- Very large legacy code base that uses RabbitMQ with extensive tooling and knowledgeable support staff
- Messages that needs to be in the same work stream for > 14 days
- Very large messages that has very low latency requirements with it
- Cloud agnostic code base requirements. If you must run your code on other platforms (e.g. Azure/Google/bare metal), then SQS is not an option
- Large volume of data for a single pipeline that can't be broke up and other solutions (e.g. Kafka) are not viable. But at a super large volume, Kafka is a lot faster. While SQS will push large payloads to S3, you are now incurring additional cost.
Leigh
quelle
3

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

Josh
quelle