1.はじめに
-
Apache Pulsar は、Yahoo ** で開発された分散型オープンソースのPublication/Subscriptionベースのメッセージングシステムです。
それは、ヤフーメール、ヤフーファイナンス、ヤフースポーツなどのようなヤフーの重要なアプリケーションを動かすために作成されました。そして、2016年に、それはApache Software Foundationの下でオープンソース化されました。
2.アーキテクチャ
-
Pulsarは、サーバー間メッセージング** 用のマルチテナント、高性能ソリューションです。それは設定と管理のための作り付けのhttps://zookeeper.apache.org/[ Apache ZooKeeper ]と共にブローカーと予約のセットで構成されています。 bookiesは Apache BookKeeper からのもので、メッセージが消費されるまでメッセージを保存します。
クラスタには、次のものがあります。
-
プロデューサーからの着信メッセージを処理するための複数のクラスターブローカー
そしてメッセージを消費者に送る ** メッセージの持続性をサポートするためのApache BookKeeper
-
Apache ZooKeeperはクラスタ設定を保存します
これをよりよく理解するために、https://pulsar.apache.org/docs/en/concepts-architecture-overview/[ドキュメント]からアーキテクチャ図を見てみましょう。
3.主な機能
重要な機能のいくつかを簡単に見てみましょう。
-
複数の作り付けのサポート
-
複数のクラスタにまたがるメッセージのジオレプリケーションのサポート
-
複数の購読モード
-
数百万のトピックに拡張可能
-
メッセージ配信を保証するためにApache BookKeeperを使用します。
-
低レイテンシ
それでは、いくつかの重要な機能について詳しく説明しましょう。
3.1. メッセージングモデル
フレームワークは柔軟なメッセージングモデルを提供します。一般に、メッセージングアーキテクチャは、2つのメッセージングモデル、すなわち待ち行列と発行者/加入者とを有する。パブリッシャ/サブスクライバは、メッセージがすべてのコンシューマに送信されるブロードキャストメッセージングシステムです。一方、キューイングはポイントツーポイント通信です。
-
Pulsarは1つの一般化されたAPI ** に両方の概念を組み合わせたものです。発行者はメッセージをさまざまなトピックに発行します。その後、これらのメッセージはすべての購読にブロードキャストされます。
消費者はメッセージを受け取るために購読します。このライブラリを使用することで、消費者は、排他、共有、フェイルオーバーなど、同じ購読でメッセージを消費するさまざまな方法を選択できます。これらの購読タイプについては、後のセクションで詳しく説明します。
3.2. 展開モード
-
Pulsarは異なる環境での展開をサポートしています**
つまり、標準のオンプレミスマシンでそれを使用することも、Kubernetesクラスタ、GoogleまたはAWS Cloudにデプロイすることもできます。
開発とテストの目的で単一のノードとして実行できます。この場合、すべてのコンポーネント(ブローカー、BookKeeper、およびZooKeeper)は単一のプロセスで実行されます。
3.3. ジオレプリケーション
-
このライブラリでは、データの地理的複製を標準でサポートしています** 異なる地域を設定することで、複数のクラスタ間でのメッセージの複製を可能にすることができます。
メッセージデータはほぼリアルタイムで複製されます。クラスタ間でネットワーク障害が発生した場合、データは常に安全でBookKeeperに保存されます。
複写システムは、複写が成功するまで再試行を続けます。
-
ジオレプリケーション機能により、組織はPulsarをさまざまなクラウドプロバイダーに展開してデータを複製することもできます。これにより、彼らは独自のクラウドプロバイダAPIの使用を避けることができます。
3.4. 永続
-
Pulsarがデータを読み、確認した後は、データの損失がないことを保証します** 。データの耐久性は、データを格納するように構成されているディスクの数に関係します。
Pulsarは、ストレージノードで稼働しているブック(Apache BookKeeperインスタンス)を使用することによって耐久性を保証します。ブッキーはメッセージを受信するたびにコピーをメモリに保存し、データをWAL(Write Ahead Log)にも書き込みます。
このログはデータベースWALと同じように機能します。 Bookiesはデータベーストランザクションの原則に基づいて動作し、マシンに障害が発生した場合でもデータが失われないようにします。
上記とは別に、Pulsarは複数のノード障害にも耐えることができます。
図書館はデータを複数の書籍に複製してから、確認メッセージをプロデューサーに送信します。このメカニズムにより、複数のハードウェア障害が発生した場合でもデータ損失がゼロになります。
4.シングルノード設定
それでは、Apache Pulsarのシングルノードクラスタを設定する方法を見てみましょう。
-
Apacheは、Java、Python、およびC ** 用のバインディングを備えた簡単なhttps://pulsar.apache.org/docs/latest/getting-started/ConceptsAndArchitecture/#client-api[client API]も提供します。後で簡単なJavaプロデューサとサブスクリプションの例を作成します。
4.1. インストール
Apache Pulsarはバイナリー配布として入手可能です。それをダウンロードすることから始めましょう:
wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-2.1.1-incubating-bin.tar.gz
ダウンロードが完了したら、zipファイルを解凍します。アーカイブされていないディストリビューションには、 bin、conf、たとえばlicenses および lib フォルダーが含まれます。
その後、作り付けのコネクタをダウンロードする必要があります。これらは現在別のパッケージとして出荷されています。
wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-io-connectors-2.1.1-incubating-bin.tar.gz
コネクタを展開して、Pulsarフォルダの____Connectorsフォルダをコピーしましょう。
4.2. インスタンスの起動
スタンドアロンインスタンスを起動するには、次のコマンドを実行します。
bin/pulsar standalone
5. Javaクライアント
それでは、メッセージを作成して消費するためのJavaプロジェクトを作成します。さまざまな購読タイプの例も作成します。
5.1. プロジェクトの設定
まず、https://search.maven.org/search?q=a:pulsar-client%20AND%20g:org.apache.pulsar[pulsar-client]依存関係をプロジェクトに追加します。
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client</artifactId>
<version>2.1.1-incubating</version>
</dependency>
5.2. プロデューサー
引き続き Producer の例を作成しましょう。ここでは、トピックとプロデューサーを作成します。
-
まず、 独自のプロトコルを使用して ** 特定のホストとポートのPulsarサービスに接続する____PulsarClientを作成する必要があります。
多くのプロデューサとコンシューマは単一のクライアントオブジェクトを共有できます。
それでは、特定のトピック名で Producer を作成します。
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<byte[]> producer = client.newProducer()
.topic(TOPIC__NAME)
.compressionType(CompressionType.LZ4)
.create();
プロデューサーは5つのメッセージを送ります。
IntStream.range(1, 5).forEach(i -> {
String content = String.format("hi-pulsar-%d", i);
Message<byte[]> msg = MessageBuilder.create()
.setContent(content.getBytes())
.build();
MessageId msgId = producer.send(msg);
});
5.3. 消費者
次に、プロデューサによって作成されたメッセージを取得するためのコンシューマを作成します。消費者は私達のサーバーに接続するために同じ PulsarClient も必要とします。
Consumer<byte[]> consumer = client.newConsumer()
.topic(TOPIC__NAME)
.subscriptionType(SubscriptionType.Shared)
.subscriptionName(SUBSCRIPTION__NAME)
.subscribe();
ここでは、 Shared 購読タイプ を持つクライアントを作成しました。 __これにより、複数のコンシューマが同じ購読に添付してメッセージを受け取ることができます。
5.4. 消費者向けの購読タイプ
上記のコンシューマの例では、** shared タイプのサブスクリプションを作成しました。また、 exclusive と failover の購読も作成できます。
排他的サブスクリプションでは、1人のコンシューマのみをサブスクライブできます。
一方、次のApacheダイアグラムに示すように、f __ailover subscription __を使用すると、1つのコンシューマに障害が発生した場合に備えて、ユーザはフォールバックコンシューマを定義できます。
6.まとめ
この記事では、メッセージングモデル、ジオレプリケーション、強力な耐久性保証など、Pulsarメッセージングシステムの機能について説明しました。
また、単一ノードの設定方法とJavaクライアントの使用方法も学びました。
いつものように、このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/apache-pulsar[Githubについて]で見つけることができます。