TL;DR

  • ストリーミング基盤ではProducerとConsumerが非同期に進化するため、スキーマ不整合が発生しやすい。
  • Schema Registry(Kafka)や Glue Schema Registry(Kinesis)は、契約(Contract)としてのスキーマ管理を提供する。
  • 後方互換性を守るルールを徹底することで、破壊的変更を防ぐ。

Kafka / RedpandaのSchema Registry

  • Avro/JSON/Protobufなどのスキーマを中央管理
  • 互換性モード(Compatibility Mode)
    • BACKWARD: 新しいProducerでも古いConsumerが読める
    • FORWARD: 古いProducerでも新しいConsumerが読める
    • FULL: 双方向互換
  • 運用では BACKWARD互換 が最も現実的

Kinesis + Glue Schema Registry

  • Kinesis Data StreamsやFirehoseでスキーマをAWS Glueに保存
  • データを投入するたびにスキーマIDを付与
  • Consumerはスキーマを参照しつつデシリアライズ
  • 互換性チェックをGlueに任せられるため、運用負荷が軽減

Flink / Kinesis Data Analyticsとの相性

  • FlinkはSchema Registryから直接スキーマを参照可能
  • Schema Evolution(列追加などの後方互換)を意識した設計が必須
  • 破壊的変更(型変更、フィールド削除)は即アウト → バックアップストリームが必要になるケースあり

Djangoとの実務Tip

API経由で受け取ったデータをそのままProducerに流すとスキーマ崩壊リスク。送信前に スキーマバリデーションレイヤー を挟むのが安全。

from jsonschema import validate, ValidationError

def send_event(event, schema):
    try:
        validate(instance=event, schema=schema)
        producer.produce("events", value=json.dumps(event))
    except ValidationError as e:
        save_to_dlq(event)  # 不正データは隔離

運用チェックリスト

  • スキーマ管理は中央リポジトリ化されているか
  • Producerリリース前に互換性チェックをCI/CDに組み込んでいるか
  • 後方互換性を守るルールをチーム内で合意済みか
  • 不正データはDLQに隔離しているか

まとめ

スキーマ管理は「誰が見ても安心して進化できる契約書」。

後方互換性を守る文化がないと、ある日突然「Consumer全滅事故」が起きる。

Schema RegistryやGlue Schema RegistryをCI/CD・運用監視に組み込み、破壊的変更を未然に防ごう。


投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です