Top 6 Warteschlangensysteme für Backend-Entwickler

Suchen Sie ein Warteschlangensystem? Oder vielleicht suchen Sie einen besseren? Hier sind alle Informationen, die Sie brauchen!

Warteschlangensysteme sind das bestgehütete Geheimnis der Backend-Entwicklung.

Ohne zu versuchen, ein Loblied auf Warteschlangensysteme zu schreiben, würde ich sagen, dass ein Junior-Backend-Entwickler ein Backend-Entwickler auf mittlerer Ebene wird, nachdem er gelernt hat, Warteschlangen in das System zu integrieren. Warteschlangen verbessern das Kundenerlebnis (wir werden sehen, wie), reduzieren die Komplexität und verbessern die Zuverlässigkeit in einem System.

Sicher, für sehr einfache Web-Apps mit nahezu null Traffic und Broschüren-Websites können Warteschlangen eine allgemeine (oder sogar unmögliche Installation sein, wenn Sie sich in einer typischen Shared-Hosting-Umgebung befinden), aber nicht triviale Apps werden alle von Warteschlangen profitieren Systeme und große Apps sind ohne Warteschlangen nicht möglich.

Bevor wir beginnen, ein Haftungsausschluss: Wenn Sie sich bereits mit Warteschlangensystemen auskennen und die verschiedenen Optionen vergleichen möchten, werden Sie in den nächsten paar einführenden Abschnitten viel Schlaf bekommen. 🙂 Springen Sie also gerne gleich weiter. Die Einführungsabschnitte sind für diejenigen gedacht, die nur eine ungefähre Vorstellung von Warteschlangensystemen haben oder den Namen nur nebenbei gehört haben.

Was ist ein Warteschlangensystem?

Beginnen wir damit, zu verstehen, was eine Warteschlange ist.

Eine Warteschlange ist eine Datenstruktur in der Informatik, die die realen Warteschlangen nachahmt, die wir um uns herum sehen. Wenn Sie zum Beispiel zu einem Ticketschalter gehen, werden Sie feststellen, dass Sie am Ende der Warteschlange stehen müssen, während die Person am Anfang der Warteschlange zuerst das Ticket bekommt. Wir nennen das auch das „Wer zuerst kommt, mahlt zuerst“-Phänomen. In der Informatik ist es möglich, Programme zu schreiben, die ihre Aufgaben auf diese Weise in einer Warteschlange speichern und sie nacheinander nach dem gleichen Prinzip „Wer zuerst kommt, mahlt zuerst“ abarbeiten.

Beachten Sie, dass die Warteschlange selbst keine eigentliche Verarbeitung durchführt. Es ist nur eine Art temporärer Speicher, bei dem Aufgaben warten, bis sie von etwas abgeholt werden. Wenn das alles etwas zu abstrakt klingt, machen Sie sich keine Sorgen. Es ist ein abstraktes Konzept, aber wir werden im nächsten Abschnitt klare Beispiele sehen. 🙂

Warum braucht man Warteschlangensysteme?

Ohne auf eine sehr lange Beschreibung einzugehen, würde ich sagen, dass der Hauptbedarf für Warteschlangensysteme in der Hintergrundverarbeitung, der parallelen Ausführung und der Wiederherstellung nach einem Ausfall besteht. Schauen wir uns diese anhand von Beispielen an:

Hintergrundverarbeitung

Angenommen, Sie führen eine E-Commerce-Marketingkampagne durch, bei der es auf Zeit ankommt, und Ihre Anwendung ist so aufgebaut, dass sie eine Bestätigungs-E-Mail auslöst, bevor der Kunde die Zahlung abschließt, und ihm die „Danke“-Seite angezeigt wird. Wenn der Mailserver, mit dem Sie sich verbinden, ausfällt, stirbt die Webseite einfach ab, was die Benutzererfahrung beeinträchtigt.

Stellen Sie sich die hohe Anzahl an Supportanfragen vor, die Sie erhalten würden! In diesem Fall ist es besser, diese E-Mail-Versandaufgabe in eine Auftragswarteschlange zu verschieben und dem Kunden die Erfolgsseite zu zeigen.

Parallele Ausführung

Viele Entwickler, insbesondere diejenigen, die hauptsächlich einfachere Anwendungen mit geringem Datenverkehr programmieren, haben die Angewohnheit, Cron-Jobs für die Hintergrundverarbeitung zu verwenden. Dies ist in Ordnung, bis die Größe der Eingabe so groß wird, dass sie nicht gelöscht werden kann. Angenommen, Sie haben einen Cron-Job, der Analyseberichte erstellt und per E-Mail an Benutzer sendet, und Ihr System kann 100 Berichte pro Minute verarbeiten.

  So verschenken Sie Musik, Filme und mehr aus dem iTunes Store

Sobald Ihre App wächst und im Durchschnitt mehr als 100 Anfragen pro Minute erhält, gerät sie immer mehr ins Hintertreffen und wird niemals alle Jobs erledigen können.

In einem Warteschlangensystem kann diese Situation vermieden werden, indem mehrere Mitarbeiter eingerichtet werden, die jeweils einen Job (mit jeweils 100 zu erledigenden Berichten) auswählen und parallel arbeiten können, um die Aufgabe viel, viel früher zu erledigen.

Erholung vom Scheitern

Wir als Webentwickler denken im Allgemeinen nicht ans Scheitern. Wir gehen davon aus, dass unsere Server und die von uns verwendeten APIs immer online sein werden. Aber die Realität sieht anders aus – Netzwerkausfälle sind allzu häufig, und die hervorragenden APIs, auf die Sie sich verlassen, können aufgrund von Infrastrukturproblemen ausfallen (bevor Sie „nicht ich!“ sagen, vergessen Sie nicht die Massiver Amazon S3-Ausfall). Zurück zum Berichtsbeispiel: Was passiert mit den 200 fehlgeschlagenen Berichten, wenn Sie für einen Teil Ihrer Berichterstellung eine Verbindung zur Zahlungs-API herstellen müssen und diese Verbindung für 2 Minuten unterbrochen ist?

Warteschlangensysteme sind jedoch mit erheblichem Overhead verbunden. Die Lernkurve ist ziemlich steil, da Sie in eine völlig neue Domäne eintreten, die Komplexität Ihrer Anwendung und Bereitstellung zunimmt und Jobs in der Warteschlange nicht immer mit 100 % Präzision gesteuert werden können. Allerdings gibt es Situationen, in denen das Erstellen einer Anwendung ohne Warteschlangen einfach nicht möglich ist.

Lassen Sie uns einen Blick auf einige der heute üblichen Optionen für Warteschlangen-Backends/-systeme werfen.

Redis

Redis ist als Schlüsselwertspeicher bekannt, der nur Datenzeichenfolgen ohne Kenntnis der Datenstruktur speichert, aktualisiert und abruft. Während dies früher vielleicht zutraf, verfügt Redis heute über effiziente und äußerst nützliche Datenstrukturen wie Listen, sortierte Sätze und sogar ein Pub-Sub-System, was es für Warteschlangenimplementierungen äußerst wünschenswert macht.

Die Vorteile von Redis sind:

  • Vollständig speicherinterne Datenbank, was zu schnelleren Lese-/Schreibvorgängen führt.
  • Hocheffizient: Kann problemlos mehr als 100.000 Lese-/Schreibvorgänge pro Sekunde unterstützen.
  • Hochflexibles Persistenzschema. Sie können entweder die maximale Leistung auf Kosten möglicher Datenverluste bei Ausfällen anstreben oder den vollständig konservativen Modus einrichten, um die Leistung zugunsten der Konsistenz zu opfern.
  • Cluster werden standardmäßig unterstützt

Bitte beachten Sie, dass Redis keine Messaging-/Warteschlangen-/Wiederherstellungs-Abstraktionen hat, sodass Sie entweder ein Paket verwenden oder selbst ein leichtes System erstellen müssen. Ein Beispiel ist, dass Redis das standardmäßige Warteschlangen-Backend für das Laravel-PHP-Framework ist, wo ein Scheduler von den Framework-Autoren implementiert wurde.

Redis lernen ist einfach.

RabbitMQ

Es gibt ein paar feine Unterschiede zwischen Redis und RabbitMQalso lass sie uns zuerst aus dem Weg räumen.

Zunächst einmal hat RabbitMQ eine spezialisiertere, klar definierte Rolle, und so wurde es entwickelt, um dies widerzuspiegeln – Messaging. Mit anderen Worten, sein Sweetspot besteht darin, als Vermittler zwischen zwei Systemen zu fungieren, was bei Redis, das als Datenbank fungiert, nicht der Fall ist. Infolgedessen bietet RabbitMQ einige weitere Funktionen, die in Redis fehlen: Nachrichtenweiterleitung, Wiederholungen, Lastverteilung usw.

  Berechnen Sie Ihr Risiko für Herzerkrankungen mit KnowYour4

Wenn Sie darüber nachdenken, können Aufgabenwarteschlangen auch als Nachrichtensystem betrachtet werden, bei dem der Planer, die Arbeiter und die Job-„Übermittler“ als Einheiten angesehen werden können, die an der Nachrichtenübermittlung teilnehmen.

RabbitMQ hat folgende Vorteile:

  • Bessere Abstraktionen für die Nachrichtenweitergabe, wodurch die Arbeit auf Anwendungsebene reduziert wird, wenn die Nachrichtenübermittlung das ist, was Sie benötigen.
  • Widerstandsfähiger gegenüber Stromausfällen und -ausfällen (zumindest standardmäßig als Redis).
  • Cluster- und Verbundunterstützung für verteilte Bereitstellungen.
  • Hilfreiche Tools zum Verwalten und Überwachen Ihrer Bereitstellungen.
  • Unterstützung für praktisch alle nicht-trivialen Programmiersprachen da draußen.
  • Bereitstellung mit dem Tool Ihrer Wahl (Docker, Chef, Puppet usw.).

Wann sollte man RabbitMQ verwenden? Ich würde sagen, es ist eine gute Wahl, wenn Sie wissen, dass Sie die asynchrone Nachrichtenübermittlung verwenden müssen, aber nicht bereit sind, die enorme Komplexität einiger der anderen Warteschlangenoptionen auf dieser Liste zu bewältigen (siehe unten).

ActiveMQ

Wenn Sie im Unternehmensbereich tätig sind (oder eine stark verteilte und umfangreiche Anwendung erstellen) und das Rad nicht ständig neu erfinden (und dabei Fehler machen) möchten, ActiveMQ ist einen Blick wert.

Hier zeichnet sich ActiveMQ aus:

  • Es ist in Java implementiert und hat daher eine wirklich nette Java-Integration (folgt dem JMS-Standard).
  • Mehrere unterstützte Protokolle: AMQP, MQTT, STOMP, OpenWire usw.
  • Behandelt Sicherheit, Routing, Nachrichtenablauf, Analysen usw. sofort einsatzbereit.
  • Integrierte Unterstützung für beliebte verteilte Messaging-Muster, wodurch Sie Zeit und kostspielige Fehler sparen.

Das soll nicht heißen, dass ActiveMQ nur für Java verfügbar ist. Es hat Clients für Python, C/C++, Node, .Net und andere Ökosysteme, daher sollte es keine Bedenken hinsichtlich eines möglichen Zusammenbruchs in der Zukunft geben. Außerdem basiert ActiveMQ auf vollständig offenen Standards, und das Erstellen eigener leichter Clients sollte einfach sein.

Nach allem, was gesagt und getan wurde, beachten Sie bitte, dass ActiveMQ nur ein Broker ist und kein Backend enthält. Sie müssen weiterhin eines der unterstützten Back-Ends verwenden, um die Nachrichten zu speichern. Ich habe es hier aufgenommen, weil es nicht an eine bestimmte Programmiersprache gebunden ist (wie andere beliebte Lösungen wie Sellerie, Sidekiq usw.).

Amazon MQ

Amazon MQ verdient hier eine kurze, aber wichtige Erwähnung. Wenn Sie der Meinung sind, dass ActiveMQ die ideale Lösung für Ihre Anforderungen ist, sich aber nicht selbst mit dem Aufbau und der Wartung der Infrastruktur befassen möchten, bietet Amazon MQ einen Managed Service dafür an. Es unterstützt alle Protokolle, die ActiveMQ verwendet – es gibt überhaupt keinen Unterschied in den Funktionen – da es ActiveMQ selbst unter der Oberfläche verwendet.

Der Vorteil ist, dass es sich um einen verwalteten Dienst handelt, sodass Sie sich um nichts anderes kümmern müssen, als ihn zu verwenden. Es ist sogar noch sinnvoller für die Bereitstellungen auf AWS, da Sie andere Dienste und Angebote direkt aus Ihrer Bereitstellung heraus nutzen können (z. B. schnellere Datenübertragungen).

Amazon SQS

Wir können nicht erwarten, dass Amazon still sitzt, wenn es um kritische Infrastrukturteile geht, oder? 🙂

  Erhalten Sie nur aktuelle Nachrichten und Artikel in der Google-Suche, indem Sie einen Datumsbereich definieren

Und das haben wir Amazon SQS, ein vollständig gehosteter, einfacher Warteschlangendienst (im wahrsten Sinne des Wortes) des bekannten Giganten AWS. Auch hier sind subtile Unterschiede wichtig, also beachten Sie bitte, dass SQS nicht über das Konzept der Nachrichtenweitergabe verfügt. Wie Redis ist es ein einfaches Backend zum Annehmen und Verteilen von Jobs in Warteschlangen.

Wann möchten Sie also Amazon SQS verwenden? Hier sind einige Gründe:

  • Sie sind ein AWS-Fan und werden nichts anderes anfassen (ehrlich gesagt, es gibt viele Leute da draußen, und ich denke, daran ist nichts auszusetzen).
  • Sie benötigen eine gehostete Lösung, stellen Sie also sicher, dass die Ausfallrate null beträgt und keine Jobs verloren gehen.
  • Sie möchten kein Cluster aufbauen und es selbst überwachen müssen. Oder noch schlimmer, Sie müssen Überwachungstools erstellen, wenn Sie diese Zeit für eine produktive Entwicklung nutzen könnten.
  • Sie haben bereits erhebliche Investitionen in die AWS-Plattform getätigt, und es ist geschäftlich sinnvoll, daran festzuhalten.
  • Sie möchten ein zielgerichtetes, einfaches Warteschlangensystem ohne jeglichen Schnickschnack, der mit Nachrichtenweitergabe, Protokollen und so weiter verbunden ist.

Alles in allem ist Amazon SQS eine solide Wahl für alle, die Auftragswarteschlangen in ihr System integrieren möchten und sich nicht um die Installation/Überwachung von Dingen selbst kümmern müssen.

Bohnenstange

Bohnenstange gibt es schon lange und ist ein kampferprobtes, schnelles und einfaches Backend für Job-Warteschlangen. Es gibt einige Merkmale von Beanstalkd, die es erheblich von Redis unterscheiden:

  • Es ist ausschließlich ein Job-Warteschlangensystem und sonst nichts. Sie schieben Jobs dorthin, die später von Jobarbeitern gezogen werden. Wenn Ihre Anwendung also nur einen winzigen Bedarf an Nachrichtenübermittlung hat, sollten Sie Beanstalkd vermeiden.
  • Es gibt keine erweiterten Datenstrukturen wie Sätze, Prioritätswarteschlangen usw.
  • Beanstalkd ist eine sogenannte First In, First Out (FIFO)-Warteschlange. Es gibt keine Möglichkeit, Jobs nach Priorität zu ordnen.
  • Es gibt keine Optionen für das Clustering.

All dies gesagt macht Beanstalkd zu einem glatten und schnellen Warteschlangensystem für einfache Projekte, die auf einem einzigen Server laufen. Für viele ist es schneller und stabiler als Redis. Also, wenn Sie haben Ausgaben mit Redis, das Sie einfach nicht lösen können, egal was passiert, und Ihre Bedürfnisse sind einfach, Beanstalkd ist einen Versuch wert.

Fazit

Wenn Sie bis hierher gelesen haben (oder hier beim Überfliegen angekommen sind 😉 ), besteht eine ziemlich gute Chance, dass Sie sich für Warteschlangensysteme interessieren oder eines brauchen. In diesem Fall wird Ihnen die Liste auf dieser Seite gute Dienste leisten, es sei denn, Sie suchen nach einem sprach-/frameworkspezifischen Warteschlangensystem.

Ich wünschte, ich könnte Ihnen sagen, dass Warteschlangen einfach und 100 % zuverlässig sind, aber das ist es nicht. Es ist chaotisch, und da alles im Hintergrund ist und sehr schnell passiert (Fehler können unbemerkt bleiben und sehr kostspielig werden). Dennoch sind Warteschlangen über einen gewissen Punkt hinaus sehr notwendig, und Sie werden feststellen, dass sie eine mächtige Waffe (vielleicht sogar die mächtigste) in Ihrem Arsenal sind. Viel Glück! 🙂