Apache Pulsarの紹介

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について]で見つけることができます。

前の投稿:Mavenによるマルチモジュールプロジェクト
次の投稿:Java数学クラスの手引き