Introduction à Apache Pulsar

Introduction à Apache Pulsar

1. introduction

Apache Pulsar is a distributed open source Publication/Subscription based messaging system developed at Yahoo.

Il a été créé pour alimenter les applications critiques de Yahoo telles que Yahoo Mail, Yahoo Finance, Yahoo Sports, etc. Puis, en 2016, il était à source ouverte sous Apache Software Foundation.

2. Architecture

Pulsar is a multi-tenant, high-performance solution for server-to-server messaging. Il est composé d'un ensemble de courtiers et de bookmakers ainsi que d'unApache ZooKeeper intégré pour la configuration et la gestion. Les bookmakers sont deApache BookKeeper qui fournissent le stockage des messages jusqu'à ce qu'ils soient consommés.

Dans un cluster, nous aurons:

  • Plusieurs courtiers en grappe pour gérer le message entrant des producteurs et l'envoyer aux consommateurs

  • Apache BookKeeper pour prendre en charge la persistance des messages

  • Apache ZooKeeper pour stocker la configuration du cluster

Pour mieux comprendre cela, jetons un coup d'œil au diagramme d'architecture desdocumentation:

image

3. Principales caractéristiques

Commençons par un rapide aperçu de certaines des fonctionnalités clés:

  • Prise en charge intégrée pour plusieurs clusters

  • Prise en charge de la réplication géographique des messages sur plusieurs clusters

  • Plusieurs modes d'abonnement

  • Adaptable à des millions de sujets

  • Utilise Apache BookKeeper pour garantir la livraison du message.

  • Faible latence

Voyons maintenant en détail certaines des fonctionnalités clés.

3.1. Modèle de messagerie

La structure fournit un modèle de messagerie flexible. En général, les architectures de messagerie ont deux modèles de messagerie, à savoir: mise en file d'attente et éditeur / abonné. Publisher/Subscriber is a broadcast messaging system in which the message is sent to all consumers. D'autre part, la mise en file d'attente est une communication point à point.

Pulsar combines both concepts in one generalized API. L'éditeur publie les messages sur différents sujets. Ensuite, ces messages sont diffusés à tous les abonnements.

Les consommateurs s'abonnent pour recevoir des messages. La bibliothèque permet aux consommateurs de choisir les différentes manières de consommer des messages dans le même abonnement, ce qui inclut exclusivité, partage et basculement. Nous aborderons ces types d'abonnement en détail dans les sections suivantes.

3.2. Modes de déploiement

Pulsar has inbuilt support for deployment in different environments. Cela signifie que nous pouvons l'utiliser sur des machines standard sur site ou le déployer dans un cluster Kubernetes, Google ou AWS Cloud.

Il peut être exécuté en tant que noeud unique à des fins de développement et de test. Dans ce cas, tous les composants (courtier, BookKeeper et ZooKeeper) s'exécutent dans un même processus.

3.3. Géo-réplication

The library provides out of the box support for geo-replication of data. Nous pouvons activer la réplication des messages entre plusieurs clusters en configurant différentes régions géographiques.

Les données du message sont répliquées presque en temps réel. En cas de défaillance du réseau sur plusieurs clusters, les données sont toujours sécurisées et stockées dans BookKeeper. Le système de réplication continue à réessayer jusqu'à ce que la réplication aboutisse.

The geo-replication feature also allows the organization to deploy Pulsar across different cloud providers and replicate the data. Cela les aide à éviter l'utilisation des API de fournisseur de nuage propriétaires.

3.4. La permanence

After Pulsar reads and acknowledges the data, it guarantees no data loss. La durabilité des données est liée au nombre de disques configurés pour stocker les données.

Pulsar assure la durabilité en utilisant des bookmakers (instance Apache BookKeeper) s'exécutant sur des nœuds de stockage. Lorsqu'un bookmaker reçoit un message, il enregistre une copie en mémoire et écrit également les données dans un journal WAL (Write Ahead Log). Ce journal fonctionne comme une base de données WAL. Les bookmakers fonctionnent sur le principe de transaction de base de données et évitent la perte de données, même en cas de panne de la machine.

En dehors de ce qui précède, Pulsar peut également supporter plusieurs pannes de nœuds. La bibliothèque réplique les données sur plusieurs bookmakers, puis envoie un message d'accusé de réception au producteur. Ce mécanisme garantit qu'aucune perte de données, même en cas de défaillance matérielle multiple.

4. Configuration de nœud unique

Voyons maintenant comment configurer un cluster de nœuds unique d'Apache Pulsar.

Apache also provides a simple client API with bindings for Java, Python, and C++. Nous créerons plus tard un exemple simple de producteur et d'abonnement Java.

4.1. Installation

Apache Pulsar est disponible sous forme de distribution binaire. Commençons par le télécharger:

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

Lorsque le téléchargement est terminé, nous pouvons désarchiver le fichier zip. La distribution non archivée contiendra le dossierbin, conf, example, licenses etlib.

Après cela, nous devons télécharger les connecteurs intégrés. Ceux-ci sont maintenant expédiés séparément.

wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-io-connectors-2.1.1-incubating-bin.tar.gz

Désarchivons les connecteurs et copions le dossierConnectors  dans le dossier Pulsar.

4.2. Démarrer une instance

Pour démarrer une instance autonome, nous pouvons exécuter:

bin/pulsar standalone

5. Client java

Nous allons maintenant créer un projet Java pour produire et consommer des messages. Nous créerons également des exemples pour différents types d'abonnement.

5.1. Mise en place du projet

Nous allons commencer par ajouter la dépendancepulsar-client à notre projet:


    org.apache.pulsar
    pulsar-client
    2.1.1-incubating

5.2. Producteur

Continuons en créant un exemple deProducer. Ici, nous allons créer un sujet et un producteur.

First, we need to create a PulsarClient which will connect to a Pulsar service on a specific host and port, utilisant son propre protocole. De nombreux producteurs et consommateurs peuvent partager un seul objet client.

Maintenant, nous allons créer unProducer avec le nom du sujet spécifique:

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();

Le producteur enverra 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. Consommateur

Ensuite, nous allons créer le consommateur pour obtenir les messages créés par le producteur. Le consommateur a également besoin des mêmesPulsarClient pour se connecter à notre serveur:

Consumer consumer = client.newConsumer()
  .topic(TOPIC_NAME)
  .subscriptionType(SubscriptionType.Shared)
  .subscriptionName(SUBSCRIPTION_NAME)
  .subscribe();

Ici, nous avons créé le client avec un type d'abonnementShared Cela permet à plusieurs consommateurs de se joindre au même abonnement et de recevoir des messages.

5.4. Types d'abonnement pour le consommateur

Dans l'exemple ci-dessus du consommateur,we have created a subscription with shared type. We can also create exclusive and failover subscriptions.

L'abonnementexclusive permet à un seul consommateur d'être abonné.

D'autre part, un failover subscription permet à l'utilisateur de définir le consommateur de secours, au cas où un consommateur échouerait, comme indiqué dans ce diagramme Apache:

image

6. Conclusion

Dans cet article, nous avons mis en évidence les fonctionnalités du système de messagerie Pulsar telles que le modèle de messagerie, la géo-réplication et de solides garanties de durabilité.

Nous avons également appris à configurer un seul nœud et à utiliser le client Java.

Comme toujours, l'implémentation complète de ce tutoriel peut être trouvéeover on Github.