Introduzione ad Apache Pulsar

1. Introduzione

Apache Pulsar è un sistema di messaggistica basato su pubblicazione / sottoscrizione distribuito open source sviluppato da Yahoo .

È stato creato per alimentare le applicazioni critiche di Yahoo come Yahoo Mail, Yahoo Finance, Yahoo Sports, ecc. Quindi, nel 2016, è stato reso open source dalla Apache Software Foundation.

2. Architettura

Pulsar è una soluzione multi-tenant ad alte prestazioni per la messaggistica da server a server . È composto da un set di broker e bookmaker insieme a un Apache ZooKeeper integrato per la configurazione e la gestione. I bookmaker provengono da Apache BookKeeper che fornisce l'archiviazione per i messaggi finché non vengono consumati.

In un cluster avremo:

  • Più broker di cluster per gestire il messaggio in arrivo dai produttori e inviare il messaggio ai consumatori
  • Apache BookKeeper per supportare la persistenza dei messaggi
  • Apache ZooKeeper per memorizzare la configurazione del cluster

Per capire meglio questo, diamo uno sguardo al diagramma dell'architettura dalla documentazione:

3. Caratteristiche principali

Cominciamo con una rapida occhiata ad alcune delle caratteristiche principali:

  • Supporto integrato per più cluster
  • Supporto per la replica geografica dei messaggi su più cluster
  • Molteplici modalità di abbonamento
  • Scalabile a milioni di argomenti
  • Utilizza Apache BookKeeper per garantire la consegna dei messaggi.
  • Bassa latenza

Ora, discutiamo in dettaglio alcune delle caratteristiche chiave.

3.1. Modello di messaggistica

Il framework fornisce un modello di messaggistica flessibile. In generale le architetture di messaggistica hanno due modelli di messaggistica, ovvero accodamento e editore / sottoscrittore. Publisher / Subscriber è un sistema di messaggistica broadcast in cui il messaggio viene inviato a tutti i consumatori. D'altra parte, fare la coda è una comunicazione punto a punto.

Pulsar combina entrambi i concetti in un'unica API generalizzata . L'editore pubblica i messaggi su diversi argomenti. Quindi questi messaggi vengono trasmessi a tutti gli abbonamenti.

I consumatori si iscrivono per ricevere messaggi. La libreria consente ai consumatori di scegliere i diversi modi di consumare i messaggi nello stesso abbonamento che include esclusivo, condiviso e failover. Discuteremo questi tipi di abbonamento in dettaglio nelle sezioni successive.

3.2. Modalità di distribuzione

Pulsar ha un supporto integrato per la distribuzione in diversi ambienti . Ciò significa che possiamo utilizzarlo su macchine locali standard o distribuirlo in un cluster Kubernetes, Google o AWS Cloud.

Può essere eseguito come un singolo nodo per scopi di sviluppo e test. In questo caso, tutti i componenti (broker, BookKeeper e ZooKeeper) vengono eseguiti in un unico processo.

3.3. Geo-replica

La libreria fornisce un supporto immediato per la replica geografica dei dati. È possibile abilitare la replica dei messaggi tra più cluster configurando diverse aree geografiche.

I dati dei messaggi vengono replicati quasi in tempo reale. In caso di errore di rete tra i cluster, i dati sono sempre al sicuro e archiviati in BookKeeper. Il sistema di replica continua a riprovare finché la replica non riesce.

La funzione di replica geografica consente inoltre all'organizzazione di distribuire Pulsar su diversi fornitori di cloud e replicare i dati . Questo li aiuta a evitare l'uso di API proprietarie del provider di cloud.

3.4. Permanenza

Dopo che Pulsar ha letto e riconosciuto i dati, non garantisce alcuna perdita di dati . La durabilità dei dati è correlata al numero di dischi configurati per archiviare i dati.

Pulsar garantisce la durabilità utilizzando bookies (istanza di Apache BookKeeper) in esecuzione nei nodi di archiviazione. Ogni volta che un bookmaker riceve un messaggio, ne salva una copia in memoria e scrive anche i dati su un WAL (Write Ahead Log). Questo registro funziona allo stesso modo di un database WAL. I bookmaker operano in base al principio delle transazioni del database e garantiscono che i dati non vadano persi anche in caso di guasto della macchina.

Oltre a quanto sopra, Pulsar può anche resistere a più guasti ai nodi. La libreria replica i dati a più bookmaker, quindi invia un messaggio di riconoscimento al produttore. Questo meccanismo garantisce una perdita di dati pari a zero anche in caso di più guasti hardware.

4. Installazione a nodo singolo

Vediamo ora come configurare un cluster a nodo singolo di Apache Pulsar.

Apache fornisce anche una semplice API client con collegamenti per Java, Python e C ++ . Successivamente creeremo un semplice produttore Java e un esempio di abbonamento.

4.1. Installazione

Apache Pulsar è disponibile come distribuzione binaria. Cominciamo scaricandolo:

wget //archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-2.1.1-incubating-bin.tar.gz

Quando il download è completo, possiamo annullare l'archiviazione del file zip. La distribuzione non archiviata conterrà bin, conf, example, licenze e cartella 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

Nell'esempio sopra del consumatore, abbiamo creato un abbonamento con tipo condiviso . Possiamo anche creare abbonamenti esclusivi e di failover .

L' abbonamento esclusivo consente di sottoscrivere un solo consumatore.

D'altra parte, un abbonamento ailover consente all'utente di definire il consumatore di fallback, nel caso in cui un consumatore fallisca, come mostrato in questo diagramma di Apache:

6. Conclusione

In questo articolo, abbiamo evidenziato le caratteristiche del sistema di messaggistica Pulsar come il modello di messaggistica, la replica geografica e le forti garanzie di durabilità.

Abbiamo anche imparato come impostare un singolo nodo e come utilizzare il client Java.

Come sempre, l'implementazione completa di questo tutorial può essere trovata su Github.