LESSON 30分

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メッセージのカテゴリ(キュー)
PartitionTopicの分割単位(並列処理の単位)
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読み書きを受け付けるパーティション
ReplicaLeaderのコピー。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.factor3耐障害性のための複製数
min.insync.replicas2書き込み成功に必要な複製数
retention.ms604800000(7日)メッセージ保持期間
num.partitionsユースケース依存想定スループットに応じて設定

まとめ

項目ポイント
アーキテクチャBroker Cluster + Topic + Partition の分散構成
耐障害性パーティションのレプリケーションとLeader選出
並列処理パーティション数 = 最大並列度
Consumer Group複数コンシューマーでの負荷分散と独立した処理

チェックリスト

  • Kafkaの主要コンポーネントとその役割を説明できる
  • パーティションとレプリケーションの仕組みを理解している
  • PythonでProducer/Consumerの基本コードを書ける
  • Consumer Groupの動作を説明できる

次のステップへ

Kafkaの基礎を理解しました。次はストリーム処理のパターンと実装を学びましょう。


推定読了時間:30分