Apache Kafkaまとめ

データ指向アプリケーションデザインを読んでKafkaについてまとめたもの


p4. メッセージキューでありながらデータベースのような耐久性を保持しているツール


p147. オープンソースのメッセージブローカー(クライアントからのメッセージを一時的に保存する中継地点)のこと。次のように動く。

  1. プロデューサが名前付きのキュー(トピック)に対してメッセージを送信

  2. ブローカーは、トピックの一つ以上のコンシューマ(サブスクライバ)にメッセージが届いたことを保証。一つのトピックには多くのプロデューサやコンシューマが関わることがある。

通常、メッセージブローカーは、特定のデータモデルを強制できない。メッセージは、多少のメタデータを持つバイト列に過ぎないので、任意のエンコーディングフォーマットが利用できる。


P163. 分散メッセージブローカーであるKafkaは、リーダーベースレプリケーションの仕組みを採用。


P233. KafkaはZooKeeperでパーティションの割り当てを追跡している。
Zookeeperとは、リクエストのノード間のルーティングを判断するためのメタデータ(例えば、キーとipアドレス/ポート番号のテーブル)を保持する独立した協調サービス。 各ノードは自分自身をZooKeeperに登録し、Zookeeperはパーティションからノードへの信頼できるマッピングを構築する。パーティションの所有者が変化したり、ノードの追加や削除が行われたりした場合には、ZooKeeperはルーティング層に通知し、そのルーティング情報が最新の状態に保たれる。

P404. Kafkaはバックエンドで動作するZooKeeper(分散キー・バリューストアと説明される)に依存する。


p490. Kafkaはログベースのメッセージブローカーである。以下のように動作する。

  1. プロデューサはメッセージをログの末尾に追記することによって送信する。

  2. コンシューマはそのログをシーケンシャルに読むことによってメッセージを受信する。

  3. コンシューマはログの末尾に到達したら、新しいメッセージが追記されたという情報を待つ。

単一のディスクで実現できるより高いスループットへスケールするためには、ログをパーティション化する方法がある。ログをパーティション化すれば、それぞれのパーティションは別々のマシンでホストできるおで、各パーティションは独立に読み書きできる。そうなれば、トピックは同じ種類のっメッセージを扱うパーティションのグループと定義できる。
ブローカーは各メッセージにオフセット(各パーティション内で単調増加するシーケンス番号)を割り当てる。パーティションには追記だけが行われるので、パーティション内ではメッセージに全順序がある。複数のパーティションに渡る順序の保証はない。
Kafkaは複数マシンへのパーティショニングを行うことによって毎秒数百万メッセージのスループットを、そしてメッセージをレプリケーションすることによって耐障害性を実現できている。

ログベースのアプローチにより、簡単にファンアウト型のメッセージングをサポートできる。複数のコンシューマが互いに影響することなく独立にログを読み取れるから。 

p499. 当然保存するログの履歴の量が制限されており、Apache Kafkaはログコンパクションの機能をサポートしている。ストレージエンジンが定期的に同じキーを持つログのレコードを探し、重複があればそれを廃棄し、それぞれのキーに関する最新の更新だけを保持する、というものである。このコンパクションとマージのプロセスは、バックグラウンドで動作する。
ログコンパクションにより、Kafkaは一過的なメッセージングだけでなく、永続性のあるストレージとしても使えるようになる。導出データシステムを再構築した場合は、新しいコンシューマをコンパクトされたログのトピックのオフセット0からスタートさせ、そのログインのすべてのメッセージをシーケンシャルにスキャンしていく。こうすると、すべてのキーの最新の値が保持していることが保証される。つまり、データベースのスナップショットをとることなく、データベースの内容の完全なコピーを取得できる。                                          


p510. Kafka Streamsでは以下のストリームの利用をサポートしている

  • ストリーム分析
    直近5分間のサービスに対する平均クエリ数や、その期間内の99%タイルのレスポンスタイムなど。通常、固定的な期間(ウィンドウ)に対して計算される。

  • マテリアライズドビューの管理
    マテリアライズドビューとは、クエリから頻繁に利用されるカウント(count)や合計値(sum)のキャッシュを生成する方法のひとつ。このストリームは、ソースのデータベースと同期された状態に保つために利用できる。


いいなと思ったら応援しよう!