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 Kafka | Redpanda | Apache Pulsar |
|---|---|---|---|
| 実装言語 | Java(Scala) | C++/Rust | Java |
| Kafka API互換 | ✅(本家) | ✅(完全互換) | 部分的 |
| ZooKeeper要否 | 不要(KRaft) | 不要 | 不要 |
| スループット | 高 | 最高 | 高 |
| マルチテナント | 限定的 | 限定的 | ✅(ネイティブ) |
| 地理分散 | 拡張必要 | 拡張必要 | ✅(ネイティブ) |
| GitHub Stars | 29k+ | 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 |