Kafka入門
田中VPoE「ストリーミングの基礎を押さえた。次はApache Kafkaを深掘りしよう。Kafkaは分散メッセージングプラットフォームとして、ストリーミング基盤のデファクトスタンダードだ。」
あなた「LinkedInが開発して、今やNetflixやUber、Airbnbなど大規模システムで使われていますよね。」
田中VPoE「そうだ。なぜKafkaがこれほど普及したのか、アーキテクチャを理解しながら学んでいこう。」
Kafkaのアーキテクチャ
基本構成
Producer → [Broker Cluster] → Consumer Group
┌─ Broker 1 ─┐
│ Topic A P0 │
│ Topic B P1 │
├─ Broker 2 ─┤
│ Topic A P1 │
│ Topic B P0 │
├─ Broker 3 ─┤
│ Topic A P2 │
│ Topic B P2 │
└─────────────┘
主要コンポーネント
| コンポーネント | 説明 |
|---|---|
| Broker | メッセージを保存・配信するサーバー |
| Topic | メッセージのカテゴリ(キュー) |
| Partition | Topicの分割単位(並列処理の単位) |
| Producer | メッセージを送信するクライアント |
| Consumer | メッセージを受信するクライアント |
| Consumer Group | 複数Consumerの論理グループ |
パーティションとレプリケーション
Topic: orders (3 partitions, replication factor=2)
Broker 1: P0(Leader), P1(Replica)
Broker 2: P1(Leader), P2(Replica)
Broker 3: P2(Leader), P0(Replica)
| 概念 | 説明 |
|---|---|
| パーティション | 並列処理の単位。パーティション数 = 最大並列度 |
| レプリケーション | 耐障害性のためのデータ複製 |
| Leader | 読み書きを受け付けるパーティション |
| Replica | Leaderのコピー。Leader障害時に昇格 |
Pythonでの基本操作
Producer
from confluent_kafka import Producer
import json
producer = Producer({
"bootstrap.servers": "localhost:9092",
"acks": "all",
})
def delivery_report(err, msg):
if err:
print(f"Delivery failed: {err}")
else:
print(f"Delivered to {msg.topic()} [{msg.partition()}]")
# メッセージ送信
event = {
"order_id": "ORD-001",
"customer_id": 123,
"total_amount": 4500,
"timestamp": "2026-03-06T10:30:00Z",
}
producer.produce(
topic="orders",
key=str(event["customer_id"]).encode(),
value=json.dumps(event).encode(),
callback=delivery_report,
)
producer.flush()
Consumer
from confluent_kafka import Consumer
import json
consumer = Consumer({
"bootstrap.servers": "localhost:9092",
"group.id": "order-processor",
"auto.offset.reset": "earliest",
})
consumer.subscribe(["orders"])
try:
while True:
msg = consumer.poll(timeout=1.0)
if msg is None:
continue
if msg.error():
print(f"Error: {msg.error()}")
continue
event = json.loads(msg.value().decode())
print(f"Received: {event['order_id']} - {event['total_amount']}円")
# ビジネスロジック処理
finally:
consumer.close()
Consumer Groupの仕組み
Topic: orders (3 partitions)
Consumer Group A (3 consumers):
Consumer 1 ← P0
Consumer 2 ← P1
Consumer 3 ← P2
Consumer Group B (2 consumers):
Consumer 4 ← P0, P1
Consumer 5 ← P2
| ルール | 説明 |
|---|---|
| 1パーティション = 最大1コンシューマー(同一グループ内) | 並列度の上限はパーティション数 |
| コンシューマー > パーティション数 | 余分なコンシューマーはアイドル状態 |
| 異なるグループ | 同じメッセージを独立に処理可能 |
Kafkaの運用設定
| 設定 | 推奨値 | 説明 |
|---|---|---|
replication.factor | 3 | 耐障害性のための複製数 |
min.insync.replicas | 2 | 書き込み成功に必要な複製数 |
retention.ms | 604800000(7日) | メッセージ保持期間 |
num.partitions | ユースケース依存 | 想定スループットに応じて設定 |
まとめ
| 項目 | ポイント |
|---|---|
| アーキテクチャ | Broker Cluster + Topic + Partition の分散構成 |
| 耐障害性 | パーティションのレプリケーションとLeader選出 |
| 並列処理 | パーティション数 = 最大並列度 |
| Consumer Group | 複数コンシューマーでの負荷分散と独立した処理 |
チェックリスト
- Kafkaの主要コンポーネントとその役割を説明できる
- パーティションとレプリケーションの仕組みを理解している
- PythonでProducer/Consumerの基本コードを書ける
- Consumer Groupの動作を説明できる
次のステップへ
Kafkaの基礎を理解しました。次はストリーム処理のパターンと実装を学びましょう。
推定読了時間:30分