2019-06-23 - メッセージング, Apache Pulsar, 社内勉強会
Apache Pulsar Consumer/Readerインターフェース
Apache Pulsarからメッセージを読み込みには、以下の2つのインターフェースを利用できる。
- Consumerインターフェース
- Readerインターフェース
これらの違いについて述べる。
カーソル
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インターフェースのユースケースとして、次のような場合が挙げられるだろう。
- 発生したイベントをすべて取得したい
→ トピックに入っているメッセージを全取得するために、カーソル位置をトピック先頭に設定する - 受信済みデータをリカバリーしたい
→ カーソル位置を巻き戻す必要があるため、カーソル位置の明示が必要
まとめ
- Apache Pulsarでメッセージを読み込むにはConsumer/Readerの2種のインターフェースが存在する
- ConsumerインターフェースとReaderインターフェースの違いは、カーソルを自動管理するか手動管理するか
- Consumerインターフェースの方が高級。まずConsumerインターフェースの利用を考える
- カーソル位置の手動設定はConsumerインターフェースでは不可。Readerインターフェースを用いる