Apache Kafka概要確認(その10 メッセージ
こんにちは。APIの確認もすみ、更に先に進みます。
15.ネットワーク層
ネットワーク層の構成は単純なNIOサーバであるため詳細な説明は省略する。
sendfileの実装はMessageSet#writeToメソッドを用いて行われる。
FileChannel#transferToメソッドにおいてFile-backedメッセージ群を用いることで
プロセス内でバッファリングするより効率的なバッファリングを実現している。
スレッドモデルとしては1つのacceptorスレッドとスレッドごとに特定の数のコネクションを処理する
N個のプロセッサスレッドで構成される。
このモデルはVoldemortで用いているNIO SocketServerにおいて実装が簡単かつ高速であることが示されている。
プロトコル自体は将来的に他の言語からでも用いれるようシンプルに保っている。
16.メッセージ
メッセージは、固定サイズのヘッダと可変長の不確定バイト配列ペイロードで構成されている。
ヘッダには、フォーマットバージョンと破損や切り捨てを検出するCRC32チェックサムを含んでいる。
不確定の要素は現状シリアライズライブラリの進歩が激しく、1つに絞ることは得策ではないため、あえて残している。
ただ、当然ながらKafkaを使用して特定のアプリケーションを作成する際にはシリアライズ方式を選択する必要が出てくる。
MessageSetインタフェースはメッセージのイテレータセットを通したNIOチャネルへのバルク書込/バルク読込に特化した構成になっている。
17.メッセージフォーマット
NByteのメッセージは下記のフォーマットとなっている。
- 1.1Byte MagicByte(フォーマット変更を可能とするための識別バイト)
MagicByte == 0
- 2.4Byte CRC32チェックサム
- 3.N-5Byte メッセージペイロード
MagicByte == 1
- 2.1Byte attributes識別子(圧縮状態、コーデック状態などを示す)
- 3.4Byte CRC32チェックサム
- 4.N-5Byte メッセージペイロード
=====
大体どういう形式でメッセージが保持されているかもわかってきました。
「最適なシリアライズ方式が現状不明確なため後から差し込めるようにする」辺りは自分たちが強いわけではない個所は
後から差し替えられるようにしようという姿勢でさすがに見えます。
今だとMessagePack辺りのシリアライズ方式になるんでしょうか・・・
=====