2019-06-23 - メッセージング, Apache Pulsar, 社内勉強会

Apache Pulsar Consumer/Readerインターフェース

Apache Pulsarからメッセージを読み込みには、以下の2つのインターフェースを利用できる。

これらの違いについて述べる。

カーソル

ConsumerインターフェースではとReaderインターフェースの違いについて知る前に、トピックのカーソルという概念について知っておきたい。 カーソルとはトピックからのメッセージ読み込み位置を示すものである。

ConsumerインターフェースとReaderインターフェースの違いはカーソルの管理手法にある。

Consumerインターフェース

カーソルの自動管理を特徴とする高級なインターフェースである。カーソルの自動管理とは以下を自動で行うことである。

以上の仕組みの実現のために、ConsumerインターフェースではサブスクリプションとACKという仕組みがある。

サブスクリプション

Consumerインターフェースよりクライアントが接続するときPulsarブローカーにサブスクリプションが作られる。 1つのサブスクリプションで1カーソルを保持していると考えて良い。尚、新規サブスクリプションの場合は、トピックの最後尾にカーソルが設定される。

ACK

ブローカーに対してメッセージの読み込み完了を通知することである。ブローカーはサブスクリプション毎にACK情報を記憶しており、ACKしたメッセージへ二度とカーソルが移動することはない。 例えば、クライアントの再起動時、ACKされていない最も古いメッセージにカーソルがセットされた状態でクライアントが動作することになる。

Readerインターフェース

カーソルの手動管理を特徴とする低級なインターフェースである。手動管理というのはカーソルの管理をブローカー側ではなくクライアント側で実施するという意味である。 Pulsarブローカー自身はカーソルの記憶などの管理を行わない。その代わり、クライアント側より明示的にカーソル位置を指定できる柔軟性がある。

ReaderインターフェースはConsumerインターフェースよりもシンプルな仕組みであり、サブスクリプションやACKの概念はない。 尚、Readerインターフェースについてはパーティションドトピックで利用できない制限がある。

概略図

公式ページにある図が分かりやすいため引用する。


引用: https://pulsar.apache.org/docs/en/2.3.1/concepts-clients

Consumer/Readerインターフェースのユースケース

ConsumerインターフェースとReaderインターフェースをどのように使い分けていけば良いかを述べる。

カーソル管理の手法の違いが、Consumer/Readerインターフェースの違いである。カーソル管理は一般にクライアント側つまりアプリケーション側にとって本質的な処理とはいえない。このため基本的にはカーソルを自動管理してくれるConsumerインターフェースを使うことを考えるとよい。

例えば、コンポーネントからコンポーネントへのデータ転送や、イベント通知といった一般的なメッセージングシステムのユースケースには大抵Consumerインターフェースで問題がない。

では、Readerインターフェースをいつ使うのかということになるが、それはConsumerインターフェースでは要求を満たせない場合である。どのような場合にConsumerインターフェースで要求を満たせないのというと、カーソル位置の手動設定が必要な場合である。 Consumerインターフェースはカーソルを自動管理する代わりに、手動でその位置をコントロールできないのである。

具体的にありそうなReaderインターフェースのユースケースとして、次のような場合が挙げられるだろう。

まとめ