イベントをパーティションに分けて保存し、コンシューマーグループで並列に読む。
注文・クリック・DB の変更などの出来事を、複数のシステム(DWH・検索・通知など)にすぐ届けたいとき、送る側が受け手ごとに直接つなぐと、受け手が増えるたび・止まるたびに送る側を直すことになります。間に Kafka のようなメッセージブローカー(メッセージを預かり、受け手に渡す仕組み)を置くと、送る側は書くだけ、受け手はそれぞれのペースで読むだけになります。
データエンジニアにとっては、ストリーム処理や CDC の土台です。面接でも、順番・重複・並列度の3つはよく聞かれます。
Kafka は、イベントを順番にためておく「追記専用のログ」です。書く側(プロデューサー)はトピックにイベントを書き、トピックはパーティションに分かれて複数のサーバーに置かれます。読む側(コンシューマー)はコンシューマーグループを作り、パーティションを分担して並列に読みます。読んだ位置(オフセット)を記録しておくので、落ちても続きから読めますし、保持期間の中なら過去にさかのぼって読み直すこともできます。
| よくある誤解 | 実際 |
|---|---|
| トピック全体で順番が守られる | 守られるのは同じパーティションの中だけ |
| 1回送れば1回だけ届く | 基本は少なくとも1回。再送で重複し得る |
| コンシューマーを増やせば必ず速くなる | 1つのパーティションはグループ内の1台しか読めない。パーティション数が並列度の上限 |
下の「ブラウザで試す」の図では、プロデューサーがキー(user_id)のハッシュでパーティションを決めて書き、3台のコンシューマーがパーティションを1つずつ分担して読み、処理したところまでのオフセットをコミットします。後半では、コンシューマー 3 が止まり、リバランスで残りの2台が分担をやり直して、最後にコミットされたオフセットから読み直す様子を見られます。上の表の「順番は同じパーティションの中だけ」「再送で重複し得る」「パーティション数が並列度の上限」が、それぞれどの手順から来るかに注目してください。
面接ではこう答える
Kafka はイベントを順番にためておく追記専用のログです。プロデューサーがトピックに書き、トピックはパーティションに分かれて複数のサーバーに置かれます。コンシューマーはグループを作ってパーティションを分担して読み、読んだ位置のオフセットを記録するので、落ちても続きから読め、保持期間の中なら過去を読み直せます。順番が守られるのは同じパーティションの中だけで、パーティションの数が並列度の上限です。
Dataとの関わりCDC やアプリのイベントの流し先としてよく使い、ストリーム処理や遅延の調査の前提になります。
ネットワーク図を読み込んでいます…