コンテンツにスキップ

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