Apache Kafka のアーキテクチャ(Hussein Nasser 解説)
概要¶
Hussein Nasser(@hnasr)による Apache Kafka のアーキテクチャ解説記事(Substack)の紹介ポスト。
詳細¶
Kafka の基本アーキテクチャ¶
[Producer]
→ Topic にメッセージを publish
[Broker クラスタ]
- Topic は複数の Partition に分割
- 各 Partition はリーダー + レプリカで冗長化
- ZooKeeper(旧)/ KRaft(新)でクラスタ管理
[Consumer Group]
- Partition を Consumer に割り当て(1 Partition = 1 Consumer)
- Group 単位でオフセットを管理
→ Consumer 数を増やしても Partition 数が上限
なぜ Kafka は高スループットか¶
1. Sequential I/O
→ メッセージをディスクに追記(append-only)
→ ランダム書き込みより大幅に速い
2. Zero-Copy
→ sendfile() システムコールでカーネルバッファから直接 NIC へ転送
→ CPU・メモリのコピーを最小化
3. Batch 処理
→ Producer/Consumer 側でメッセージをバッチ化して送受信
→ ネットワーク往復コストを削減
4. Page Cache 活用
→ OS のページキャッシュを積極的に使う
→ ヒットすればディスク I/O 不要
Partition とスケーラビリティ¶
Partition を増やす → Consumer を増やせる → 並列処理が増える
注意点:
- Partition 数はあとから増やせる(が、既存メッセージの順序が変わる)
- Consumer 数 > Partition 数 にしても意味がない(遊ぶ Consumer が出る)
- キーベースのルーティング: 同じキー → 同じ Partition → 順序保証
オフセット管理¶
Consumer は自分がどこまで読んだか(offset)を Kafka 自身(__consumer_offsets トピック)に保存
→ Consumer が死んでも別インスタンスが引き継げる
→ at-least-once / at-most-once / exactly-once の保証レベルを選べる
なぜ重要か / いつ使うか¶
- イベント駆動アーキテクチャ・マイクロサービス間の非同期通信に使うとき
- ログ収集・ストリーム処理(Flink, Spark Streaming との組み合わせ)
- Webhook 配信・通知システムのキュー層として選定するとき
- システム設計面接で「なぜ Kafka を選ぶか」を説明するとき
元記事: https://substack.com/@hnasr/note/p-161458753