LESSON 30分

Lambda/Kappaアーキテクチャ

田中VPoE「バッチ処理とストリーミング処理、それぞれ学んだ。実際のシステムでは両方を組み合わせることが多い。Lambdaアーキテクチャと、そのシンプル版であるKappaアーキテクチャを比較しよう。」

あなた「バッチで正確性を担保しつつ、ストリーミングでリアルタイム性も確保する構成ですね。」

田中VPoE「そうだ。ただし、2つのパイプラインを維持するコストも考慮する必要がある。それぞれの長所と短所を理解して選択しよう。」

Lambdaアーキテクチャ

概要

バッチ処理層とリアルタイム処理層の2系統を持つアーキテクチャです。

                     ┌─→ [Batch Layer] ─→ [Batch View]  ─┐
[Data Source] ─→ [Raw Data]                                ├→ [Serving Layer] → Query
                     └─→ [Speed Layer] ─→ [Real-time View]─┘

3つの層

役割ツール例
Batch Layer全データの再処理、正確な集計Spark, dbt, Airflow
Speed Layerリアルタイムの近似集計Kafka Streams, Flink
Serving Layerバッチ結果とリアルタイム結果の統合Druid, ClickHouse

NetShop社での適用例

注文イベント
    ├─→ [Kafka] → [Flink] → リアルタイム売上ダッシュボード
    │                        (近似値、数秒のレイテンシ)

    └─→ [S3] → [Spark/dbt] → 日次正確な売上レポート
                               (正確な値、翌朝までに完成)

Lambdaアーキテクチャの問題点

問題説明
コードの重複バッチとストリーミングで同じロジックを2回実装
運用負荷2系統のパイプラインの監視・メンテナンス
整合性バッチとリアルタイムの結果が一時的に不一致
デバッグの困難さ問題がどちらの層で発生したか特定が難しい

Kappaアーキテクチャ

概要

ストリーミング処理のみで全てを処理するアーキテクチャです。

[Data Source] → [Stream Processing] → [Serving Layer] → Query

              [Reprocessing: Replay from Log]

設計思想

  • 全データをイベントログ(Kafka)に保存
  • ストリーム処理エンジンが唯一の処理パス
  • 再処理が必要な場合はログを再生(Replay)
項目LambdaKappa
処理パスバッチ + ストリーミングストリーミングのみ
コード重複ありなし
運用負荷
再処理バッチで実行ログ再生で実行
データ保持ストレージ + ログログ(長期保持)
適用条件複雑な集計、厳密な正確性ストリーム処理で完結する場合

どちらを選ぶか

Lambdaが適するケース

  • バッチでしか計算できない複雑な集計(機械学習モデルの再学習等)
  • ストリーム処理の近似値では許容できない厳密な正確性が必要
  • 既存のバッチパイプラインがあり、リアルタイム機能を追加したい

Kappaが適するケース

  • 全ての処理がストリームで完結する
  • 運用チームが小さく、シンプルさが重要
  • イベントログの長期保持が可能

現実的なアプローチ

推奨: 段階的アプローチ

Step 1: バッチ処理でMVPを構築
Step 2: リアルタイム要件が明確な機能だけストリーミング化
Step 3: 必要に応じてLambda/Kappaを採用

Unified Batch + Streaming

近年のフレームワークはバッチとストリーミングの統一APIを提供しています。

# Apache Spark Structured Streaming の例
from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

# ストリーミング読み込み
stream_df = (
    spark.readStream
    .format("kafka")
    .option("kafka.bootstrap.servers", "localhost:9092")
    .option("subscribe", "orders")
    .load()
)

# バッチと同じAPIで処理
result = (
    stream_df
    .selectExpr("CAST(value AS STRING) as json")
    .select(from_json("json", schema).alias("data"))
    .select("data.*")
    .groupBy(window("timestamp", "5 minutes"))
    .agg(sum("total_amount").alias("revenue"))
)

# ストリーミング出力
query = (
    result.writeStream
    .outputMode("update")
    .format("console")
    .start()
)

まとめ

項目ポイント
Lambdaバッチ + ストリーミングの2パス、正確性重視だが運用負荷が高い
Kappaストリーミングのみ、シンプルだがログ長期保持が前提
選択基準正確性要件、チーム規模、既存資産を考慮
統一APISpark等で同じコードでバッチ/ストリーミングを処理

チェックリスト

  • LambdaアーキテクチャとKappaアーキテクチャの違いを説明できる
  • 各アーキテクチャの長所と短所を比較できる
  • ユースケースに応じた適切なアーキテクチャを選択できる
  • 段階的なアプローチで導入する戦略を理解している

次のステップへ

Lambda/Kappaアーキテクチャを理解しました。次は演習でストリーミングパイプラインを実際に設計してみましょう。


推定読了時間:30分