AI

OSSイベントストリーミング比較:Apache Kafka vs Redpanda vs Apache Pulsar

オープンソースラボ編集部2026年6月14日

OSSイベントストリーミング比較:Apache Kafka vs Redpanda vs Apache Pulsar

Apache Confluent Cloud(Kafkaマネージドサービス)は月$1.50/CKU〜と従量課金でコストが増大します。Apache Kafka(業界標準のイベントストリーミング)・Redpanda(Kafka互換・C++/Rustで再実装した高速版)・Apache Pulsar(マルチテナント・地理分散対応)はOSSのイベントストリーミングプラットフォームです。

イベントストリーミングの活用場面

  • マイクロサービス間の非同期通信: サービス間でイベントを介して疎結合に通信
  • リアルタイムデータパイプライン: アプリのイベントをBigQuery・S3に即座にストリーム
  • イベントソーシング: データベースの変更をイベントとして記録(CDC: Change Data Capture)
  • ログ集約: 複数サービスのログを一元収集してElasticsearch等に転送
  • ストリーム処理: フィンテック・eコマースのリアルタイム不正検知

主要ツールの概要

Apache Kafka

2011年にLinkedInが開発しApache Software Foundationに寄贈した分散メッセージングシステムです。GitHubスター29k+。パーティションによるスケーラブルな並列処理と持続的なログストレージ(消費後もメッセージを保持)が特徴です。Kafkaをマネージドで使うConfluent・Amazon MSK・Azure Event Hubsのベースとなっています。

# KafkaをDockerでローカル起動(KRaftモード・ZooKeeper不要)
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  kafka:
    image: apache/kafka:latest
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_LOG_RETENTION_BYTES: -1
EOF

docker compose up -d

# トピックを作成
docker exec kafka /opt/kafka/bin/kafka-topics.sh \
  --create --topic user-events \
  --bootstrap-server localhost:9092 \
  --partitions 6 \
  --replication-factor 1
# Kafka PythonクライアントでProducer/Consumer実装
from kafka import KafkaProducer, KafkaConsumer
import json
from datetime import datetime

# Producer: イベントを送信
producer = KafkaProducer(
    bootstrap_servers=["localhost:9092"],
    value_serializer=lambda v: json.dumps(v, ensure_ascii=False).encode("utf-8"),
    key_serializer=lambda k: k.encode("utf-8") if k else None,
    acks="all",
    retries=3,
)

# user-idをキーに指定(同じユーザーのイベントが同じパーティションに)
producer.send(
    topic="user-events",
    key="user-12345",
    value={
        "event_type": "product_viewed",
        "user_id": "user-12345",
        "product_id": "prod-789",
        "timestamp": datetime.now().isoformat(),
    }
)
producer.flush()

# Consumer: イベントを受信して処理
consumer = KafkaConsumer(
    "user-events",
    bootstrap_servers=["localhost:9092"],
    group_id="analytics-service",  # コンシューマーグループ
    auto_offset_reset="earliest",
    value_deserializer=lambda v: json.loads(v.decode("utf-8")),
)

for message in consumer:
    event = message.value
    print(f"[p={message.partition} off={message.offset}] {event['event_type']}")

Redpanda

2021年に公開されたKafka互換のイベントストリーミングプラットフォームです。GitHubスター10k+。Kafka APIと完全互換のためKafkaのクライアントをそのまま使えます。C++/Rustで実装されZooKeeper不要・JVM不要のアーキテクチャにより、Kafkaより高スループット・少ないリソース消費を実現します。

# RedpandaをDockerで起動(Kafka互換)
docker run -d \
  --name redpanda \
  --restart unless-stopped \
  -p 9092:9092 \
  -p 9644:9644 \
  -v redpanda_data:/var/lib/redpanda/data \
  redpandadata/redpanda:latest \
  redpanda start \
  --advertise-kafka-addr localhost:9092 \
  --overprovisioned --smp 1 --memory 1G --reserve-memory 0M \
  --node-id 0 --check=false

# トピック作成
docker exec redpanda rpk topic create user-events --partitions 6
docker exec redpanda rpk topic list
# RedpandaはKafka互換 - kafka-pythonをそのまま使用
from kafka import KafkaProducer
import json

producer = KafkaProducer(
    bootstrap_servers=["localhost:9092"],  # Redpandaに向けるだけ
    value_serializer=lambda v: json.dumps(v).encode("utf-8"),
)
producer.send("user-events", value={"event": "test", "from": "redpanda"})
producer.flush()

Apache Pulsar

2016年にYahooが開発しApache Software Foundationが管理するエンタープライズ向けメッセージングシステムです。GitHubスター14k+。マルチテナント(テナントごとの名前空間・権限管理)・地理分散レプリケーションストリームとキューの両立が特徴です。BookKeeperをストレージレイヤーに分離することで柔軟なスケーリングが可能です。

# Apache PulsarをDockerで起動
docker run -d \
  --name pulsar \
  -p 6650:6650 -p 8080:8080 \
  -v pulsar_data:/pulsar/data \
  apachepulsar/pulsar:latest \
  bin/pulsar standalone

# テナント・名前空間・トピックを作成
docker exec pulsar bin/pulsar-admin tenants create my-company --allowed-clusters standalone
docker exec pulsar bin/pulsar-admin namespaces create my-company/user-events
docker exec pulsar bin/pulsar-admin topics create persistent://my-company/user-events/page-views
# Pulsar Python clientでProducer/Consumer
import pulsar

client = pulsar.Client("pulsar://localhost:6650")

producer = client.create_producer("persistent://my-company/user-events/page-views")
producer.send("Page viewed: /products/789".encode("utf-8"))

consumer = client.subscribe(
    "persistent://my-company/user-events/page-views",
    subscription_name="analytics-sub"
)
msg = consumer.receive()
print(f"Received: {msg.data().decode('utf-8')}")
consumer.acknowledge(msg)
client.close()

機能比較表

比較項目Apache KafkaRedpandaApache Pulsar
実装言語Java(Scala)C++/RustJava
Kafka API互換✅(本家)✅(完全互換)部分的
ZooKeeper要否不要(KRaft)不要不要
スループット最高
マルチテナント限定的限定的✅(ネイティブ)
地理分散拡張必要拡張必要✅(ネイティブ)
GitHub Stars29k+10k+14k+

イベントストリーミングからのデータをBIツールで可視化するにはDevOpsカテゴリ/categories/devopsのApache Supersetが有効です。マイクロサービス間通信の監視・トレーシングには同じDevOpsカテゴリ/categories/devopsのOpenTelemetryと組み合わせることをお勧めします。Kafkaに流れる機密データの管理にはSecurityカテゴリ/categories/securityのパスワードマネージャーとVPNで通信を保護してください。

FAQ

Q. KafkaとRabbitMQはどう使い分けますか?

A. アーキテクチャが根本的に異なります。Kafka: ログ型ストレージ。メッセージはコンシューム後も保持され再読み込み可能。高スループット(100万メッセージ/秒)。イベントソーシング・CDC・ストリーム処理に最適。RabbitMQ: キュー型。メッセージはコンシューム後に削除。複雑なルーティング・デッドレターキュー・優先度付きキューが得意。低レイテンシのRPC・タスクキューに適切。選択指針: ①メッセージを保持して後で再処理したい→Kafka②複雑なルーティング・タスクキューが必要→RabbitMQ③100万件/秒以上の高スループット→Kafka。

Q. Redpandaの「Kafkaより高速」は本当ですか?

A. ベンチマーク条件次第ですが、一般的に事実です。KafkaはJVMのGCが発生するのに対し、RedpandaはC++ネイティブ実装でGCなし。ただし小規模(月間10億メッセージ以下)では体感差は小さく、既存のKafkaエコシステム(Kafka Streams・ksqlDB・Kafka Connect)の成熟度の方が重要な選択基準になることが多いです。

Q. Kafkaのコンシューマーグループはどのように機能しますか?

A. コンシューマーグループは同じトピックを複数のコンシューマーインスタンスで並列処理する仕組みです。

# コンシューマーグループの動作
# トピック: user-events(パーティション数: 6)
# コンシューマーグループ: analytics-service(インスタンス: 3台)
# パーティション0,1 → Consumer Instance 1
# パーティション2,3 → Consumer Instance 2
# パーティション4,5 → Consumer Instance 3
# 1台が落ちると残り2台でパーティションを再割り当て(リバランス)

from kafka import KafkaConsumer

consumer = KafkaConsumer(
    "user-events",
    bootstrap_servers=["localhost:9092"],
    group_id="analytics-service",
)

注意: パーティション数以上にコンシューマーインスタンスを増やしても効果なし。スループット向上のためにはパーティション数を増やす必要があります。

Q. Kafkaのデータ保持期間とストレージコスト計算方法は?

A. Kafkaのデータ保持はlog.retention.hoursで設定します(デフォルト168時間=7日)。

# ストレージ計算例
# 月間10億メッセージ x 平均1KBメッセージ = 1TB/月
# 7日間保持: 1TB x (7/30) = 233GB、3レプリカ: 233GB x 3 = 700GB

# トピックごとに保持設定を変更
docker exec kafka /opt/kafka/bin/kafka-configs.sh \
  --alter --topic user-events \
  --add-config retention.ms=604800000 \
  --bootstrap-server localhost:9092

Tiered Storage(S3にオフロード)をConfluent/Redpandaで使うと古いデータをS3に自動移動してローカルディスクコストを削減できます。

まとめ

ユースケース推奨ツール
標準・エコシステム重視Apache Kafka
高スループット・省リソースRedpanda
マルチテナント・地理分散Apache Pulsar

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。