スキーマ進化はKafka本番運用の要です。互換性モードの選択を誤ると、ロールアウト途中で消費者がデータを読めなくなります。特にCCDAKでは「どちらを先に更新するか」と互換性モードの対応関係が頻出ポイントです。
本稿では、公式ドキュメントの挙動に沿って、BACKWARD / FORWARD / FULLの本質、推移(Transitive)設定、デプロイ戦略との整合、よくある落とし穴をまとめます。最終章にREST API例と演習問題も付けています。
互換性モードは、新しいスキーマを登録する際に「直前(あるいは履歴)のスキーマと比較して安全に読み書きできるか」をSchema Registryが検証する仕組みです。要点は、どちらの順番でロールアウトするかです。
BACKWARDは消費者(新スキーマ)→生産者(旧データ)を読み取れることを保証し、消費者先行の更新に向きます。FORWARDは消費者(旧スキーマ)→生産者(新データ)を読み取れることを保証し、生産者先行の更新に向きます。FULLは両方向を同時に満たし、混在期間が長い場合や双方向互換が必要なときに使います。
| モード | 保証される互換性 | ロールアウト指向 | 代表的に安全な変更 |
|---|---|---|---|
| BACKWARD | 新スキーマの消費者が旧データを読める | 消費者先行 | フィールド追加(デフォルト必須)、型の昇格(Avroのルール内) |
| FORWARD | 旧スキーマの消費者が新データを読める | 生産者先行 | フィールド削除(旧側でデフォルト補完可)、互換な型変換 |
| FULL | BACKWARDとFORWARDの両方 | 双方向混在 | 慎重な追加・削除・型変換(両方向でOKなもののみ) |
| NONE | 検証なし | なし | なし |
ロールアウト方向と互換性モードの関係(概念図)
時間 -->
消費者先行(BACKWARD):
Consumer v2 (new schema)
^ ^ 読める
| |
Consumer v1 <- Data by Producer v1/v2
生産者先行(FORWARD):
Data by Producer v2 (new schema) -> Consumer v1 (old schema) 読める
^ 生産者を先に切替
FULL(双方向):
Producer v1/v2 混在 <-> Consumer v1/v2 混在
どちらの組み合わせでも読めることを要求BACKWARDやFORWARDには、直前バージョンのみを比較する通常モードと、履歴上の全バージョンと比較する推移モード(_TRANSITIVE)が存在します。
長寿命トピックや多数のアプリが段階的にアップデートされる環境では、推移モードが安全側に働きます。短期で必ず全クライアントが追随できる前提なら通常モードでも現実的です。
Schema RegistryはAvro、JSON Schema、Protobufをサポートしますが、互換性判定は各フォーマットの解決ルールに基づきます。以下は実務で安全側とされる代表例です(詳細は各公式仕様に依存)。
特にAvroではデフォルト値の有無が重要で、追加や削除の安全性を大きく左右します。Protobufではフィールド番号の再利用禁止、予約管理がポイントです。
ロールアウト順序と互換性モードの整合が取れていれば、長時間の混在期間でも事故を避けられます。逆に順序とモードが噛み合っていないと、途中で読めないデータが発生します。
サブジェクト命名戦略(TopicNameStrategy / RecordNameStrategy / TopicRecordNameStrategy)も進化計画に影響します。レコード再利用やスキーマの横展開があるならRecordNameStrategy系を検討し、影響範囲をサブジェクト単位で制御します。
互換性はグローバルとサブジェクト単位で設定できます。まずはグローバルを保守的に、例外的なサブジェクトのみ上書きするのが無難です。
本番適用前に必ず互換性APIで事前検証を行い、CIに組み込みます。
互換性モード設定と事前検証の例(Avro, application/json)
## グローバル互換性をFULL_TRANSITIVEに設定
curl -s -X PUT \
-H "Content-Type: application/json" \
--data '{"compatibility": "FULL_TRANSITIVE"}' \
http://localhost:8081/config
## サブジェクト単位で上書き(topic-valueをBACKWARDに)
curl -s -X PUT \
-H "Content-Type: application/json" \
--data '{"compatibility": "BACKWARD"}' \
http://localhost:8081/config/my-topic-value
## 既存バージョン(latest)との互換性を事前チェック
NEW_SCHEMA='{
"schema": "{\"type\":\"record\",\"name\":\"User\",\"fields\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"name\",\"type\":\"string\",\"default\":\"\"}]}"
}'
curl -s -X POST \
-H "Content-Type: application/json" \
--data "$NEW_SCHEMA" \
http://localhost:8081/compatibility/subjects/my-topic-value/versions/latest
## 問題なければ登録
curl -s -X POST \
-H "Content-Type: application/json" \
--data "$NEW_SCHEMA" \
http://localhost:8081/subjects/my-topic-value/versionsCCDAKでは、互換性名称とロールアウト方向の取り違えが典型的なひっかけです。BACKWARDは「新が旧を読める」、FORWARDは「旧が新を読める」。この向きを体で覚えてください。
また、TRANSITIVEの有無、フィールドのデフォルト、Protobufのフィールド番号の扱いなども問われます。互換性チェックは直前または履歴全体との機械的な整合であり、意味論的な破壊は検出できない点も注意。
CCDAK
問題 1
既存の消費者(旧スキーマ)は当面変更できません。一方で生産者を先にデプロイし、新しいフィールドを追加したい。どの互換性モードが適切ですか?
正解: A
生産者先行のロールアウトでは、旧スキーマの消費者が新データを読めることを保証するFORWARDが適切。FULLでも要件を満たすが、問題文では旧消費者のみの読み取り保証が主眼のためFORWARDが最小要件に合致する。
BACKWARDとBACKWARD_TRANSITIVEの違いは?
前者は直前バージョンとの互換性を求め、後者は履歴上の全てのバージョンとの互換性を求めます。長期間にわたり古いデータが残る、または古い消費者が残存する場合はTRANSITIVEを選ぶと安全です.
JSON SchemaやProtobufでもAvroと同じ互換性ルールですか?
いいえ。互換性判定はフォーマット固有の解決ルールに基づきます。例えばProtobufはフィールド番号の再利用が禁止で、番号変更は破壊的です。JSON Schemaは必須化や制約強化が破壊的になりやすい。運用前に対象フォーマットの公式仕様を確認してください。
本番で一時的にNONEにして登録を通すのはアリ?
緊急対応として短時間のみという前提なら現場で行われることはありますが、強い推奨はできません。実施する場合は対象サブジェクト限定、直後にモード復元、CIでの事前互換性チェック強化、影響範囲レビューを徹底してください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...