Einführung in Apache Pulsar

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.