1. Einleitung
Apache Pulsar ist ein verteiltes Open Source-Messaging-System, das auf Veröffentlichungen und Abonnements basiert und bei Yahoo entwickelt wurde .
Es wurde entwickelt, um die kritischen Anwendungen von Yahoo wie Yahoo Mail, Yahoo Finance, Yahoo Sports usw. zu unterstützen. 2016 wurde es unter der Apache Software Foundation als Open-Source-Lösung bereitgestellt.
2. Architektur
Pulsar ist eine mandantenfähige, leistungsstarke Lösung für Server-zu-Server-Nachrichten . Es besteht aus einer Reihe von Brokern und Buchmachern sowie einem integrierten Apache ZooKeeper für Konfiguration und Verwaltung. Die Buchmacher stammen von Apache BookKeeper und bieten Speicherplatz für die Nachrichten, bis sie verbraucht sind.
In einem Cluster haben wir:
- Mehrere Cluster-Broker verarbeiten die eingehende Nachricht von Herstellern und versenden die Nachricht an die Verbraucher
- Apache BookKeeper zur Unterstützung der Nachrichtenpersistenz
- Apache ZooKeeper zum Speichern der Clusterkonfiguration
Um dies besser zu verstehen, schauen wir uns das Architekturdiagramm aus der Dokumentation an:

3. Hauptmerkmale
Beginnen wir mit einem kurzen Blick auf einige der wichtigsten Funktionen:
- Eingebaute Unterstützung für mehrere Cluster
- Unterstützung für die Georeplikation von Nachrichten über mehrere Cluster hinweg
- Mehrere Abonnementmodi
- Skalierbar auf Millionen von Themen
- Verwendet Apache BookKeeper, um die Zustellung von Nachrichten zu gewährleisten.
- Geringe Wartezeit
Lassen Sie uns nun einige der wichtigsten Funktionen im Detail diskutieren.
3.1. Messaging-Modell
Das Framework bietet ein flexibles Messaging-Modell. Im Allgemeinen haben Messaging-Architekturen zwei Messaging-Modelle, nämlich Warteschlange und Herausgeber / Abonnent. Publisher / Subscriber ist ein Broadcast-Messaging-System, bei dem die Nachricht an alle Verbraucher gesendet wird. Auf der anderen Seite ist das Anstehen eine Punkt-zu-Punkt-Kommunikation.
Pulsar kombiniert beide Konzepte in einer verallgemeinerten API . Der Herausgeber veröffentlicht die Nachrichten zu verschiedenen Themen. Diese Nachrichten werden dann an alle Abonnements gesendet.
Die Verbraucher abonnieren, um Nachrichten zu erhalten. In der Bibliothek können Verbraucher die verschiedenen Möglichkeiten zum Konsumieren von Nachrichten im selben Abonnement auswählen, einschließlich Exklusiv, Freigegeben und Failover. Wir werden diese Abonnementtypen in den späteren Abschnitten ausführlich besprechen.
3.2. Bereitstellungsmodi
Pulsar bietet integrierte Unterstützung für die Bereitstellung in verschiedenen Umgebungen . Dies bedeutet, dass wir es auf lokalen Standardcomputern verwenden oder in einem Kubernetes-Cluster, Google oder AWS Cloud bereitstellen können.
Es kann zu Entwicklungs- und Testzwecken als einzelner Knoten ausgeführt werden. In diesem Fall werden alle Komponenten (Broker, BookKeeper und ZooKeeper) in einem einzigen Prozess ausgeführt.
3.3. Geo-Replikation
Die Bibliothek bietet sofort Unterstützung für die Georeplikation von Daten. Wir können die Replikation von Nachrichten zwischen mehreren Clustern aktivieren, indem wir verschiedene geografische Regionen konfigurieren.
Nachrichtendaten werden nahezu in Echtzeit repliziert. Bei einem Netzwerkausfall zwischen Clustern sind die Daten immer sicher und werden im BookKeeper gespeichert. Das Replikationssystem versucht es erneut, bis die Replikation erfolgreich ist.
Mit der Geo-Replikationsfunktion kann das Unternehmen Pulsar auch für verschiedene Cloud-Anbieter bereitstellen und die Daten replizieren . Dies hilft ihnen, die Verwendung proprietärer Cloud-Anbieter-APIs zu vermeiden.
3.4. Dauerhaftigkeit
Nachdem Pulsar die Daten gelesen und bestätigt hat, wird kein Datenverlust garantiert . Die Datenbeständigkeit hängt von der Anzahl der Festplatten ab, die zum Speichern der Daten konfiguriert sind.
Pulsar stellt die Haltbarkeit sicher, indem Buchmacher (Apache BookKeeper-Instanz) verwendet werden, die in Speicherknoten ausgeführt werden. Wenn ein Buchmacher eine Nachricht empfängt, speichert er eine Kopie im Speicher und schreibt die Daten auch in eine WAL (Write Ahead Log). Dieses Protokoll funktioniert genauso wie eine Datenbank-WAL. Die Buchmacher arbeiten nach dem Prinzip der Datenbanktransaktion und stellen sicher, dass auch bei einem Maschinenausfall keine Daten verloren gehen.
Abgesehen davon kann Pulsar auch mehrere Knotenausfälle aushalten. Die Bibliothek repliziert Daten an mehrere Buchmacher und sendet dann eine Bestätigungsnachricht an den Hersteller. Dieser Mechanismus garantiert, dass auch bei mehreren Hardwarefehlern kein Datenverlust auftritt.
4. Einzelknoten-Setup
Lassen Sie uns nun sehen, wie Sie einen einzelnen Knotencluster von Apache Pulsar einrichten.
Apache bietet auch eine einfache Client-API mit Bindungen für Java, Python und C ++ . Wir werden später ein einfaches Java-Produzenten- und Abonnement-Beispiel erstellen.
4.1. Installation
Apache Pulsar ist als Binärdistribution verfügbar. Beginnen wir mit dem Herunterladen:
wget //archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-2.1.1-incubating-bin.tar.gz
Wenn der Download abgeschlossen ist, können wir die Archivierung der Zip-Datei aufheben. Die nicht archivierte Distribution enthält bin, conf, Beispiel, Lizenzen und den Ordner lib .
After that, we need to download the inbuilt connectors. These now ship as a separate package:
wget //archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-io-connectors-2.1.1-incubating-bin.tar.gz
Let's unarchive the connectors and copy the Connectors folder in the Pulsar folder.
4.2. Starting an Instance
To start a standalone instance we can execute:
bin/pulsar standalone
5. Java Client
Now we'll create a Java project to produce and consume messages. We'll also create examples for different subscription types.
5.1. Setting up the Project
We'll start by adding the pulsar-client dependency to our project:
org.apache.pulsar pulsar-client 2.1.1-incubating
5.2. Producer
Let's continue by creating a Producer example. Here, we'll create a topic and a producer.
First, we need to create a PulsarClient which will connect to a Pulsar service on a specific host and port, using its own protocol. Many producers and consumers can share a single client object.
Now, we'll create a Producer with the specific topic name:
private static final String SERVICE_URL = "pulsar://localhost:6650"; private static final String TOPIC_NAME = "test-topic";
PulsarClient client = PulsarClient.builder() .serviceUrl(SERVICE_URL) .build(); Producer producer = client.newProducer() .topic(TOPIC_NAME) .compressionType(CompressionType.LZ4) .create();
The producer will send 5 messages:
IntStream.range(1, 5).forEach(i -> { String content = String.format("hi-pulsar-%d", i); Message msg = MessageBuilder.create() .setContent(content.getBytes()) .build(); MessageId msgId = producer.send(msg); });
5.3. Consumer
Next, we'll create the consumer to get the messages created by the producer. The consumer also requires the same PulsarClient to connect with our server:
Consumer consumer = client.newConsumer() .topic(TOPIC_NAME) .subscriptionType(SubscriptionType.Shared) .subscriptionName(SUBSCRIPTION_NAME) .subscribe();
Here we've created the client with a Shared subscription type. This allows multiple consumers to attach to the same subscription and get messages.
5.4. Subscription Types for Consumer
Im obigen Beispiel des Verbrauchers haben wir ein Abonnement mit gemeinsam genutztem Typ erstellt. Wir können auch exklusive und Failover- Abonnements erstellen .
Mit dem exklusiven Abonnement kann nur ein Verbraucher abonniert werden.
Auf der anderen Seite kann der Benutzer mit einem Abonnement den Fallback-Konsumenten definieren, falls ein Konsument ausfällt, wie in diesem Apache-Diagramm gezeigt:

6. Fazit
In diesem Artikel haben wir die Funktionen des Pulsar-Messagingsystems wie das Messaging-Modell, die Geo-Replikation und starke Haltbarkeitsgarantien hervorgehoben.
Wir haben auch gelernt, wie man einen einzelnen Knoten einrichtet und wie man den Java-Client verwendet.
Wie immer finden Sie die vollständige Implementierung dieses Tutorials auf Github.