ApachePulsarの紹介

1.はじめに

Apache Pulsarは、Yahooで開発された分散型のオープンソースのパブリケーション/サブスクリプションベースのメッセージングシステムです。

これは、Yahoo Mail、Yahoo Finance、Yahoo SportsなどのYahooの重要なアプリケーションを強化するために作成されました。その後、2016年に、Apache SoftwareFoundationの下でオープンソースになりました。

2.アーキテクチャ

Pulsarは、サーバー間メッセージング用のマルチテナントの高性能ソリューションです。それは作り付けとともにブローカーやブックメーカーのセットで構成されますApacheのZooKeeperの設定と管理のため。ブックメーカーは、メッセージが消費されるまでメッセージのストレージを提供するApacheBookKeeperからのものです。

クラスターには次のものがあります。

  • プロデューサーからの着信メッセージを処理し、メッセージをコンシューマーにディスパッチする複数のクラスターブローカー
  • メッセージの永続性をサポートするApacheBookKeeper
  • クラスター構成を保存するApacheZooKeeper

これをよりよく理解するために、ドキュメントのアーキテクチャ図を見てみましょう。

3.主な機能

主な機能のいくつかを簡単に見てみましょう。

  • 複数のクラスターの組み込みサポート
  • 複数のクラスターにわたるメッセージのジオレプリケーションのサポート
  • 複数のサブスクリプションモード
  • 何百万ものトピックに拡張可能
  • ApacheBookKeeperを使用してメッセージ配信を保証します。
  • 低遅延

それでは、いくつかの主要な機能について詳しく説明しましょう。

3.1。メッセージングモデル

フレームワークは、柔軟なメッセージングモデルを提供します。一般に、メッセージングアーキテクチャには、キューイングとパブリッシャー/サブスクライバーという2つのメッセージングモデルがあります。パブリッシャー/サブスクライバーは、メッセージがすべてのコンシューマーに送信されるブロードキャストメッセージングシステムです。一方、キューイングはポイントツーポイント通信です。

Pulsarは、両方の概念を1つの一般化されたAPIに組み合わせています。出版社は、さまざまなトピックにメッセージを公開します。次に、これらのメッセージはすべてのサブスクリプションにブロードキャストされます。

消費者はメッセージを受け取るためにサブスクライブします。ライブラリを使用すると、コンシューマーは、排他的、共有、フェイルオーバーなど、同じサブスクリプションでメッセージを消費するさまざまな方法を選択できます。これらのサブスクリプションタイプについては、後のセクションで詳しく説明します。

3.2。展開モード

パルサーには、さまざまな環境での展開のサポートが組み込まれています。つまり、標準のオンプレミスマシンで使用することも、Kubernetesクラスター、Google、またはAWSクラウドにデプロイすることもできます。

開発およびテストの目的で、単一ノードとして実行できます。この場合、すべてのコンポーネント(ブローカー、BookKeeper、およびZooKeeper)は単一のプロセスで実行されます。

3.3。ジオレプリケーション

ライブラリは、データの地理的複製をすぐにサポートします。異なる地理的リージョンを構成することにより、複数のクラスター間でメッセージのレプリケーションを有効にできます。

メッセージデータはほぼリアルタイムで複製されます。クラスタ間でネットワーク障害が発生した場合、データは常に安全で、BookKeeperに保存されます。レプリケーションシステムは、レプリケーションが成功するまで再試行を続けます。

The geo-replication feature also allows the organization to deploy Pulsar across different cloud providers and replicate the data. This helps them to avoid the use of proprietary cloud provider APIs.

3.4. Permanence

After Pulsar reads and acknowledges the data, it guarantees no data loss. Data durability is related to the number of disks configured to store the data.

Pulsar ensures durability by using bookies (Apache BookKeeper instance) running in storage nodes. Whenever a bookie receives a message, it saves a copy in memory and also writes the data to a WAL (Write Ahead Log). This log works in the same way as a database WAL. Bookies operate on database transaction principle and ensure that data is not lost even in case of machine failure.

Apart from the above, Pulsar can also withstand multiple node failures. The library replicates data to multiple bookies, then sends an acknowledgment message to the producer. This mechanism guarantees that zero data loss even in case of multiple hardware failures.

4. Single Node Setup

Now let's see how to set up a single node cluster of Apache Pulsar.

Apache also provides a simple client API with bindings for Java, Python, and C++. We'll later create a simple Java producer and subscription example.

4.1. Installation

Apache Pulsar is available as a binary distribution. Let's start by downloading it:

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

When the download is complete, we can unarchive the zip file. The unarchived distribution will contain bin, conf, example, licenses and lib folder.

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

上記のコンシューマーの例では、共有タイプのサブスクリプションを作成しました。排他的サブスクリプションとフェイルオーバーサブスクリプションを作成することもできます。

排他的なサブスクリプションは、唯一の消費者が加入することができます。

一方、af ailoverサブスクリプションでは、次のApacheダイアグラムに示すように、1つのコンシューマーに障害が発生した場合に、ユーザーがフォールバックコンシューマーを定義できます。

6.結論

この記事では、メッセージングモデル、ジオレプリケーション、強力な耐久性保証など、Pulsarメッセージングシステムの機能に焦点を当てました。

また、単一ノードのセットアップ方法とJavaクライアントの使用方法も学びました。

いつものように、このチュートリアルの完全な実装はGithubにあります。