このページの目次

Kafka アーキテクチャ

Kafka はメッセージシステムを、消費後に削除されるキューではなく、不変でパーティション化され、再生可能なログとしてモデル化します。パーティション内の順序保証により同じキーのメッセージの順序が保たれ、ISR メカニズムによりレプリケーションと永続性のトレードオフが制御され、consumer group によりパーティション所有権の調整が分散協調の問題に変換されます。

Partition: 順序付き不変ログ

Topic = 複数の partition:
  Partition 0: [offset 0][offset 1][offset 2]...[offset N]  ← 追記のみ
  Partition 1: [offset 0][offset 1][offset 2]...[offset N]
  Partition 2: [offset 0][offset 1][offset 2]...[offset N]

Producer: キーに基づいて partition を選択: partition = murmur2(key) % N_partitions
  → 同じキーは同じ partition へ → そのキーのメッセージは順序付き
  → key=null → ラウンドロビン (負荷分散、順序なし)

Consumer: pull ベース、offset は consumer によって管理される

ISR (In-Sync Replica)

各 partition には 1 つの leader replica と N 個の follower replicas があります。ISR 内の replicas のみが「同期済み」と見なされます:

Leader: producer が書き込み → leader: ログへの追記 → followers: leader からフェッチ
  → follower が確認: 「オフセット X までレプリケートしました」
  → replica.lag.time.max.ms 以内に follower が確認しない場合 → ISR から削除
  → min.insync.replicas: 各メッセージはコミットされるまでに、少なくともこの数の ISR コピーの確認が必要

leader がクラッシュした場合、新しい leader は ISR 内の follower から選出されます。ISR 外の follower は切り捨てのリスクがあります(ログが leader と分岐するため)。

Consumer Group

1 つの topic の partition は、同じ consumer group 内の1つの consumer によってのみ消費されます。partition は group のメンバー間で割り当てられます。

Consumer Group: 1つのpartitionはグループ内の1つのconsumerのみが消費可能 Topic: 3つのpartition P0 P1 P2 Consumer 1 P0を消費 Consumer 2 P1を消費 Consumer 3 P2を消費 各partitionは1つのconsumerのみによって消費される → そのpartition内のメッセージ順序は保証される Consumer 2 クラッシュ リバランストリガー Consumer 1 または 3 に割り当て P2を引き継ぐ リバランスはpartitionの所有権のみを再割り当てし、同時に各partitionは1つのconsumerのみによって消費され続け、順序保証は影響を受けない

Consumer group は順序を保証します:各 partition には 1 つの consumer しかいないため、consumer が見るその partition のメッセージは順序付けられています。

Offset Commit

Consumer は offset を自身で管理します — broker からのプッシュには依存しません。通常、offset は Kafka 内部の __consumer_offsets topic に保存されます:

Consumer: poll() → N件のメッセージ取得 → 処理 → commitSync(offsets)
  → enable.auto.commit=false: 手動コミット (推奨、処理成功後)
  → enable.auto.commit=true: 定期的な自動コミット (メッセージ消失の可能性あり)

Log Compaction

時間ベースではなく、キーに基づいて最後の値を保持します:

圧縮前のログ:
  key=A, value=X
  key=B, value=Y
  key=A, value=Z    ← key A の最新値

圧縮後のログ:
  key=B, value=Y
  key=A, value=Z

→ 適している: KTable (更新ストリーム、最新状態)
→ 適していない: KStream (イベントストリーム、各変更は独立したイベント)

参考

  • Kafka: kafka.apache.org/documentation/#design
  • ISR: kafka.apache.org/documentation/#replication

キーワード: Kafka, partition, ISR, consumer group, rebalance, offset commit, log compaction