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.