Ein Dummy's Guide für verteilte Warteschlangen

Wenn Sie sich jemals gefragt haben, worum es bei Kafka, Heron, Echtzeit-Streaming, SQS oder RabbitMQ geht, dann ist dieser Artikel genau das Richtige für Sie. Ich werde im Detail diskutieren, warum wir eine Warteschlange für die moderne Softwarearchitektur von heute benötigen, welche gängigen Technologien verwendet werden und wie Warteschlangen in der Branche häufig verwendet werden. Wenn Ihnen dieser Artikel gefällt, habe ich einen Kurs zur Skalierung verteilter Systeme, in dem ich diese Themen ausführlicher diskutiere.

OK, lass uns loslegen!

Warum benötigen Sie in erster Linie einen Warteschlangen- / Nachrichtenbroker?

Die Geschichte, wie eine Warteschlange die Limonade rettete, steht

Stellen Sie sich vor, Sie betreiben eine Limonade? Sie haben eine kleine Web-App entwickelt, mit der Sie nachverfolgen können, wie oft Ihre Kunden zu Ihrem Limonadenstand zurückkehren.

Ihre Web-App hat einen Endpunkt, sagen Sie yourlemonade.com/traffic, und jedes Mal, wenn Sie auf eine Schaltfläche klicken, steigt die Anzahl der Zugriffe um 1. Wunderschön.

Wenn der Verkehr zu Ihrem Limonadenstand zunimmt, klicken Sie immer mehr auf die Schaltfläche. Da Sie in einer relativ kleinen Nachbarschaft leben, erhalten Sie nur 10 bis 20 Personen pro Tag. Ihr Verkauf läuft wie gewohnt ab, die Web-App verarbeitet den Datenverkehr einwandfrei und alles ist in Ordnung und gut. Perfekt.

Der Albtraum eines boomenden Geschäfts

Nachdem sich Ihr Limonadenstand einen Namen gemacht hat, strömen Menschen aus der ganzen Stadt herbei, um einen Vorgeschmack auf Ihre berühmte Limonade zu erhalten. Und an einem schönen Sonntagmorgen beschlossen die lokalen Nachrichten, Ihren Stand zu bewerben, und der Verkehr explodiert .

Wie Sie sich vorstellen können, steigt der Verkehr zu Ihrem Limonadenstand von 10 bis 20 Personen pro Tag auf 10.000 pro Tag. Sie tippen heftig auf die Verkehrstaste, was wiederum einen Anruf bei yourlemonade.com/traffic auslöst , und Ihre Web-App erhöht ständig den Verkehr.

Leider wird Ihre Web-App auf einem 8-Bit-Server mit 128 MB RAM in Ihrer Hausgarage gehostet. Aufgrund des boomenden Geschäfts und des zunehmenden Datenverkehrs kann Ihre Web-App den Datenverkehr nicht mehr bewältigen.

Schließlich stirbt Ihr Server. ☠️

Damit wird Ihre gesamte Web-App heruntergefahren. Sie können den Verkehr nicht mehr verfolgen. Die Leute stürmen herein, die Bestellungen häufen sich, aber Ihre Web-App ist ausgefallen und Sie können keine Transaktionen abwickeln, bis Sie den Datenverkehr erneut protokollieren können.

Wie geht's?

Warteschlange zur Rettung

Ein Moment der Brillanz fällt Ihnen auf. Was ist, wenn ich eine Kiste vor die Theke stelle, in der jeder Kunde einfach eine Nachricht ablegen kann, dass er dort war?

Jedes Mal, wenn ein Kunde durch die Tür kommt und eine Bestellung aufgibt, bitten Sie ihn höflich, seine Bestellblätter in eine kleine Schachtel vor dem Zahlungsschalter zu legen. Hervorragend! Sie haben im Wesentlichen einen Mechanismus eingeführt, mit dem Sie die Ankunft verfolgen und gleichzeitig sicherstellen können, dass Ihr Unternehmen wie gewohnt funktioniert.

Dies nennen wir asynchrone Verarbeitung und sind in der Welt der Warteschlangen willkommen . ?

Wenn Sie anfangen, Software zu erstellen, ähnlich wie der oben erwähnte Limonadenstand, ist es üblich, dass eine Aufgabe ausgeführt wird

  1. Rufen Sie dann einen Dienst an
  2. Warten Sie, bis der Dienst beendet ist, und dann
  3. Fahren Sie mit der nächsten Aufgabe fort.

Dies wird als synchrone Verarbeitung bezeichnet. Die asynchrone Verarbeitung hingegen ermöglicht es einer Aufgabe, einen Dienst aufzurufen und mit der nächsten Aufgabe fortzufahren, während der Dienst die Anforderung in seinem eigenen Tempo verarbeitet. Aus diesem Grund ist eine Warteschlange eine schöne und elegante Möglichkeit, Ihre Systeme zu entsperren, da sie Ihren Diensten eine Ebene vorlegt und es ihnen ermöglicht, die Aufgaben in ihrem eigenen Tempo zu erledigen.

Wenn eine Warteschlange so mächtig ist, warum stellen wir sie dann nicht einfach vor alles?

Wie jeder, der sich mit verteilten Systemen beschäftigt hat, bezeugen kann, ist die Skalierung eines verteilten Systems äußerst schwierig und kompliziert. Es gibt einige Dinge über Warteschlangen zu wissen, die eine Warteschlange zu einem unattraktiven Angebot für Ihr System machen können.

Einige Fragen, die ich stellen würde, bevor ich mich entscheide, ob eine Warteschlange die richtige Lösung für Sie ist:

  • Hat Ihr Service Probleme aufgrund des hohen Datenverkehrs? Wenn dies nicht der Fall ist, sollten Sie sich möglicherweise mit dem Engpass befassen, bevor Sie in Warteschlangen springen. Wie Donald Knuth bekanntlich sagte, ist vorzeitige Optimierung die Wurzel allen Übels.
  • Haben Sie internes Fachwissen in der Verwaltung einer Warteschlange? Oder müssen Sie möglicherweise ein Team einstellen, das dies für Sie erledigt? Wartungskosten wie das Skalieren der Warteschlange können in die Höhe schnellen, wenn Sie nicht vorsichtig sind. Es gibt Dienste wie Amazon SQS (Simple Queuing Service), die eine verwaltete Lösung anbieten (dh Sie müssen nichts selbst warten).
  • Ist es möglich, doppelte Einträge in der Warteschlange zu haben? Wenn ja, ist das akzeptabel?
  • Müssen Sie alle Transaktionen aufzeichnen, falls eine Warteschlange ausfällt?
  • Muss eine Warteschlange in der Lage sein, alle Einträge wiederzugeben, wenn eine Warteschlange ausfällt? Was sind Ihre Sicherungsoptionen?

Es gibt noch viele weitere Probleme, die für Ihren Anwendungsfall spezifisch sein könnten, aber ich habe hoffentlich darauf hingewiesen, dass das Hinzufügen einer Warteschlange nicht so einfach ist wie das Schnippen mit den Fingern.

Wie Warteschlangen in der modernen Architektur verwendet werden

Warteschlangen sind in der heutigen modernen Architektur verteilter Systeme allgegenwärtig - branchenübergreifend für verschiedene Anwendungsfälle eingesetzt, und es gibt jeden Tag neuere Anwendungsfälle.

Hier sind einige der realen Anwendungsfälle für Warteschlangen:

Echtzeit-Streaming

Als MapReduce auf den Markt kam, war dies ein großes Phänomen in der Branche, da nur Sterbliche Petabyte an Daten in einer angemessenen Zeitspanne von Tagen bis Stunden verarbeiten konnten. Dies mag heute absurd erscheinen, wenn Daten in fast Sekunden verfügbar sind, aber vor MapReduce war es nicht einfach, verwendbare Daten aus extrem großen Datenmengen zu extrahieren.

Der Appetit auf Datenanalyse ist gewachsen, und wir versuchen nun, Daten innerhalb von Stunden und manchmal Millisekunden zu verarbeiten .

Um eine kontinuierliche Analyse und Leistung mit geringer Latenz zu erreichen, wurde das Konzept des Echtzeit-Streamings konzipiert.

Ein nützliches Beispiel hierfür sind Anzeigen: Anzeigen auf Twitter werden beispielsweise täglich Millionen von Menschen angezeigt. Um sicherzustellen, dass Nutzer innerhalb eines festgelegten Zeitraums nicht mehrmals dieselben Anzeigen sehen, muss Twitter irgendwie wissen, wann ein Nutzer das letzte Mal einer bestimmten Anzeige ausgesetzt war.

Wenn wir uns bei dieser Aktion auf MapReduce verlassen hätten, wäre dies nicht einmal eine Lösung, da die Verarbeitung all dieser Daten mehr als Stunden dauern würde. Stattdessen können wir durch Echtzeit-Streaming Anzeigenimpressionen verarbeiten, sobald sie eintreffen. Dies alles wird durch Warteschlangen ermöglicht, mit denen Daten kontinuierlich in Echtzeit gestreamt und verarbeitet werden können.

Einige Technologien, von denen Sie in Echtzeit-Streaming-Anwendungsfällen häufig hören, sind Kafka, Kafka-Streams, Redis, Spark-Streaming (das sich von Spark unterscheidet) usw.

Ereignisgesteuerte Architektur

Warteschlangen werden als kritische Komponente einer ereignisgesteuerten Architektur verwendet oder umgangssprachlich als Pub (Lisher) - Sub (Scriber) bezeichnet. Ereignisgesteuerte Architektur ist laut Wikipedia:

Event-Driven Architecture (EDA) ist ein Softwarearchitekturmuster, das die Produktion, Erkennung, den Verbrauch und die Reaktion auf Ereignisse fördert.

Ich möchte dies als Abonnement eines Newsletters betrachten: Als Produzent eines Newsletters wissen Sie, wer Ihren Newsletter abonniert hat und wer nicht. Sie schreiben den Inhalt und senden ihn dann an Ihre Abonnenten.

Auf der anderen Seite haben Sie als Abonnent möglicherweise mehrere Newsletter abonniert, wissen aber nicht, wer die anderen Abonnenten sind. Aber das interessiert dich nicht wirklich. Dies ist eine wirklich nette Funktion, da Sie jetzt Software schreiben können, die eine Reihe von Ereignissen abhört und nur auf diejenigen reagiert, an denen Sie interessiert sind.

RabbitMQ und Amazon SQS (Simple Queuing Service) sind einige der Technologien, die häufig für diese Art von Anwendungsfällen verwendet werden.

Verteilte, fehlertolerante, skalierbare Infrastruktur

Verteilte Systeme sind fehleranfällig, und eine Warteschlange ist eine von mehreren Möglichkeiten, um die Ausfallsicherheit in der Architektur zu erhöhen. In einer Microservice-Architektur (oder einer serviceorientierten Architektur) kommunizieren mehrere Microservices über Warteschlangen als gemeinsam genutzte Schnittstellen miteinander.

Wenn ein Mikrodienst unerwartet ausfällt, kann eine Warteschlange weiterhin Nachrichten akzeptieren. Dies bietet im Wesentlichen einen Puffer für die Wiederherstellung unseres Mikroservices. Sobald der Microservice wieder online ist, kann er die Nachrichten aus der Warteschlange abholen und erneut verarbeiten.

Betrachten Sie es als Ihre Mailbox. Während Sie in Hawaii Urlaub machen, wird der Postbote Ihre Post weiterhin in die Mailbox liefern. Sobald Sie aus dem Urlaub zurückkehren, können Sie die Post abholen und nach Belieben bearbeiten.

Danke fürs Lesen! Ich hoffe, Sie haben in meinem Artikel ein oder zwei Dinge über verteilte Warteschlangen gelernt. Wenn Sie dies gerne gelesen haben, hinterlassen Sie bitte einen Klatsch und abonnieren Sie meinen Newsletter hier, in dem ich über Software und technische Interviews schreibe!

Ressourcen, die ich empfehle

Um Ihr Verständnis der Warteschlangen und der verschiedenen oben genannten Themen zu verbessern, würde ich diese Ressourcen im Folgenden wärmstens empfehlen. Oder nehmen Sie an meinem Kurs zur Skalierung verteilter Systeme teil, um mehr über Warteschlangen zu erfahren :)

  • Entwerfen datenintensiver Anwendungen: Ein großartiges Buch zum Erlernen der Skalierung verteilter Systeme! Sehr empfehlenswert.
  • Kafka the Guide: Ich habe dieses Buch als Nachschlagewerk verwendet und es für die allgemeine Beschreibung genossen.
  • Kafka-Streams: Dies ist ein informativer Artikel von Confluent, der ausführlich über die Implementierung der Stream-Verarbeitung durch Kafka spricht.
  • Elemente von Programmierinterviews: Hervorragend geeignet, um Codierungsprobleme zu lösen.
  • Cracking The Coding Interview: Hervorragend geeignet, um grundlegende CS-Codierungsprobleme zu behandeln.
  • Daily Coding Problem.com: Dies ist eine kostenlose Website, die kostenlose tägliche Codierungsprobleme bietet. Sie können sich für interessante tägliche Codierungsherausforderungen anmelden und für Lösungen bezahlen, wenn Sie möchten. Wenn Sie meinen Empfehlungslink (dailycodingproblem.com/zhiachong) verwenden, erhalten Sie 10 US-Dollar Rabatt!

(Zu Ihrer Information, ich teile mehr Ressourcen auf meiner Website: zhiachong.com, wo ich mich persönlich bewährt habe, und empfehle es Software-Ingenieuren aller Ebenen.)

Prost!