yahoo/Pulsar (standalone) 用のDockerfileを作った

PulsarはYahooが作ったPub/Subシステム。マルチテナント環境で運用されることを前提にした設計、大量のトピック・パーティションがある時Kafkaよりパフォーマンスに優れる、などの特徴がある。

先日、Pulsar勉強会に参加して、そこそこに魅力が伝わってきたので、Dockerコンテナでサクッと試せるよう、Dockerfileを書いた。ついでにJavaでクライアントも書いた。

使い方

Brokerの起動

まずDockerコンテナでPulsar Brokerを立ち上げる(standaloneモードだと同時にZookeeperやBookKeeperも立ち上がる)。

$ docker run -d \
        -p 8080:8080 -p 6650:6650 \
        --env BROKER_HOST=192.168.99.100 \
        laclefyoshi/pulsar-docker-standalone

ポート8080はBrokerのHTTPエンドポイントのポート、ポート6650はBrokerのサービスのポートで、クライアントはHTTPエンドポイント(8080)からBroker情報を受け取り、実際にデータをやり取りするのはサービス(6650)を使う。クライアントが使うのはこの2つの通信経路だけ。

環境変数 BROKER_HOST はクライアントから見て、どのホストにBrokerがあるのかを指定するためのもの。Brokerとクライアントが同じマシンにあるのなら 127.0.0.1 でも可。

Javaクライアントの準備

GitHub - laclefyoshi/pulsar-docker: PulsarをDockerコンテナで使うの client-example に入り、Mavenでビルドする。

$ git clone https://github.com/laclefyoshi/pulsar-docker.git
$ cd pulsar-docker/client-example/
$ mvn clean package
$ ls target/
classes/
generated-sources/
maven-archiver/
maven-status/
original-pulsar-client-example-1.0-SNAPSHOT.jar
pulsar-client-example-1.0-SNAPSHOT.jar

トピックなどの設定は、standaloneモードで用意されているデフォルトのものがハードコーディングされている。

Concumerの起動

Brokerからメッセージを受け取るクライアントとしてConsumerを立ち上げる。BrokerのHTTPエンドポイントを引数で指定する。

$ java -cp target/pulsar-client-example-1.0-SNAPSHOT.jar \
       org.saekiyoshiyasu.PulsarConsumer http://192.168.99.100:8080
Producerの起動

Consumerとは別のターミナルで、Brokerへメッセージを送信するクライアントとしてProducerを立ち上げる。Consumerと同様、BrokerのHTTPエンドポイントを引数で指定する。

$ java -cp target/pulsar-client-example-1.0-SNAPSHOT.jar \
       org.saekiyoshiyasu.PulsarProducer http://192.168.99.100:8080
$
Consumerでのメッセージ受け取り

起動したままのConsumerは、Producerが送信したメッセージを受け取り、内容を出力する。

Received message: Hello 0
Received message: Hello 1
Received message: Hello 2
Received message: Hello 3
Received message: Hello 4
Received message: Hello 5
Received message: Hello 6
Received message: Hello 7
Received message: Hello 8
Received message: Hello 9

standaloneモードじゃないclusterモード

Pulsarのドキュメントによると、clusterモードでの起動には以下の手順が必要のよう。

  1. Zookeeperの設定&起動
  2. Global Zookeeperの設定&起動
  3. クラスタメタデータの更新
  4. BookKeeperの設定&起動
  5. Brokerの設定&起動
  6. Service Discoveryの設定&起動
  7. テナント設定

一筋縄ではいかなかったので、今後の課題とする。