このページの目次
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 は順序を保証します:各 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