Apache Pulsarの紹介

Apache Pulsarの概要

1. 前書き

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

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

2. 建築

Pulsar is a multi-tenant, high-performance solution for server-to-server messaging。 ブローカーとブックメーカーのセットと、構成と管理のための組み込みのApache ZooKeeperで構成されています。 ブックメーカーはApache BookKeeperからのもので、メッセージが消費されるまでメッセージのストレージを提供します。

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

  • プロデューサーからの着信メッセージを処理し、メッセージをコンシューマーにディスパッチする複数のクラスターブローカー

  • メッセージの永続性をサポートするApache BookKeeper

  • クラスター構成を保存するApache ZooKeeper

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

image

3. 主な機能

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

  • 複数のクラスターの組み込みサポート

  • 複数のクラスターにわたるメッセージの地理的複製のサポート

  • 複数のサブスクリプションモード

  • 数百万のトピックに拡張可能

  • Apache BookKeeperを使用して、メッセージ配信を保証します。

  • 低遅延

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

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

このフレームワークは、柔軟なメッセージングモデルを提供します。 一般に、メッセージングアーキテクチャには2つのメッセージングモデルがあります。 キューイングおよびパブリッシャー/サブスクライバー。 Publisher/Subscriber is a broadcast messaging system in which the message is sent to all consumers. 一方、キューイングはポイントツーポイントのコミュニケーションです。

Pulsar combines both concepts in one generalized API。 発行者は、さまざまなトピックにメッセージを発行します。 次に、これらのメッセージはすべてのサブスクリプションにブロードキャストされます。

コンシューマは、メッセージを取得するためにサブスクライブします。 このライブラリにより、コンシューマは、排他的、共有、フェイルオーバーを含む同じサブスクリプションで異なる方法でメッセージを消費することができます。 これらのサブスクリプションタイプについては、後のセクションで詳しく説明します。

3.2. 展開モード

Pulsar has inbuilt support for deployment in different environments。 つまり、標準のオンプレミスマシンで使用したり、Kubernetesクラスター、Google、AWSクラウドにデプロイしたりできます。

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

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

The library provides out of the box support for geo-replication of data.異なる地理的地域を構成することで、複数のクラスター間でメッセージのレプリケーションを有効にできます。

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

The geo-replication feature also allows the organization to deploy Pulsar across different cloud providers and replicate the data。 これにより、独自のクラウドプロバイダーAPIの使用を回避できます。

3.4. 永続

After Pulsar reads and acknowledges the data, it guarantees no data loss。 データの耐久性は、データを保存するように構成されたディスクの数に関連しています。

Pulsarは、ストレージノードで実行されるブッキー(Apache BookKeeperインスタンス)を使用して耐久性を確保します。 ブッキーはメッセージを受信するたびに、コピーをメモリに保存し、データをWAL(Write Ahead Log)に書き込みます。 このログは、データベースWALと同じように機能します。 Bookiesはデータベーストランザクションの原則に基づいて動作し、マシンに障害が発生した場合でもデータが失われないようにします。

上記とは別に、Pulsarは複数のノード障害にも耐えることができます。 ライブラリはデータを複数のブックに複製し、確認メッセージをプロデューサーに送信します。 このメカニズムにより、複数のハードウェア障害が発生した場合でもデータ損失がゼロになります。

4. 単一ノードのセットアップ

それでは、ApachePulsarのシングルノードクラスターをセットアップする方法を見てみましょう。

Apache also provides a simple client API with bindings for Java, Python, and C++。 後で、簡単な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, example, 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 folderをコピーしましょう。

4.2. インスタンスを開始する

スタンドアロンインスタンスを起動するには、次を実行します。

bin/pulsar standalone

5. Javaクライアント

次に、メッセージを生成および消費するJavaプロジェクトを作成します。 また、さまざまなサブスクリプションタイプの例を作成します。

5.1. プロジェクトのセットアップ

プロジェクトにpulsar-client依存関係を追加することから始めます。


    org.apache.pulsar
    pulsar-client
    2.1.1-incubating

5.2. プロデューサー

続けて、Producerの例を作成しましょう。 ここでは、トピックとプロデューサーを作成します。

First, we need to create a PulsarClient which will connect to a Pulsar service on a specific host and port, 独自のプロトコルを使用します。 多くのプロデューサーとコンシューマーは、単一のクライアントオブジェクトを共有できます。

次に、特定のトピック名で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 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 msg = MessageBuilder.create()
      .setContent(content.getBytes())
      .build();
    MessageId msgId = producer.send(msg);
});

5.3. 消費者

次に、プロデューサーによって作成されたメッセージを取得するためのコンシューマーを作成します。 コンシューマーは、サーバーに接続するために同じPulsarClientも必要とします。

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

ここでは、Sharedサブスクリプションタイプでクライアントを作成しました。これにより、複数のコンシューマーが同じサブスクリプションに接続してメッセージを取得できます。

5.4. 消費者向けのサブスクリプションタイプ

上記のコンシューマーの例では、we have created a subscription with shared type. We can also create exclusive and failover subscriptions.

exclusiveサブスクリプションでは、1人のコンシューマーのみをサブスクライブできます。

一方、failover subscriptionを使用すると、次のApacheダイアグラムに示すように、1つのコンシューマーに障害が発生した場合に、ユーザーがフォールバックコンシューマーを定義できます。

image

6. 結論

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

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

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