Schema Registry は、Kafka 上のイベントスキーマを一元管理し、進化を安全にするための中核コンポーネントです。互換性チェックを正しく選ぶだけで、長期運用の事故率は大きく下がります。
本稿は CCDAK 対策を意識しつつ、Avro/Protobuf/JSON Schema の違い、Subject 設計、互換性モードの選択、運用の落とし穴を具体的に解説します。
Schema Registry は、スキーマの登録・バージョニング・検索と、互換性チェックを提供するサービスです。スキーマは Kafka の内部トピック(既定では _schemas)に保存され、書き込みはリーダーを通して直列化されます。クライアントは通常、Confluent のシリアライザを介してスキーマ ID を解決し、メッセージに埋め込みます。
重要なポイントは、毎メッセージで REST を呼ばないことです。一度スキーマ ID を解決すれば、以降はキャッシュされた ID を使って直列化・逆直列化できます。Registry が一時的に停止しても、未登録のスキーマを使わない限りは送受信を継続できます。
Producer/Consumer と Schema Registry の連携イメージ
Schema Registry は Subject 単位でスキーマを版管理します。デフォルトの TopicNameStrategy では topic-value と topic-key が Subject 名になります。RecordNameStrategy や TopicRecordNameStrategy を使うと、レコード名(完全修飾名)を主語にして複数トピックで同一スキーマを共有できます。
本番では勝手登録を避けるため、プロデューサで auto.register.schemas を無効化し、事前登録または CI/CD で承認付き登録を行う運用が一般的です。互換性レベルはグローバルとサブジェクト単位の両方で設定できますが、サブジェクト設定が優先されます。
Avro スキーマの登録と Java Producer 設定例
# Avro スキーマ登録(orders-value)
# 注意: JSON 内で schema を文字列としてエスケープ
curl -s -X POST \
-H 'Content-Type: application/vnd.schemaregistry.v1+json' \
--data '{"schema":"{\"type\":\"record\",\"name\":\"Order\",\"namespace\":\"com.example\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"double\",\"default\":0.0}]}"}' \
http://localhost:8081/subjects/orders-value/versions
// Java Producer の主要プロパティ例(KafkaAvroSerializer を利用)
Properties p = new Properties();
p.put("bootstrap.servers", "broker:9092");
p.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
p.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
p.put("schema.registry.url", "http://sr:8081");
// 本番は勝手登録を避ける
p.put("auto.register.schemas", "false");
// 既登録の最新バージョンを解決して使用(要要件確認)
p.put("use.latest.version", "true");
// Subject 命名戦略例(既定は TopicNameStrategy)
p.put("value.subject.name.strategy", "io.confluent.kafka.serializers.subject.TopicNameStrategy");互換性チェックは、新しいスキーマと既存スキーマの関係を検証します。latest のみ比較するか、全履歴(transitive)と比較するかで厳しさが変わります。Avro/Protobuf/JSON Schema で細部の許容差はありますが、モードの意味は共通です。
典型的には、先にコンシューマを更新できる環境では Backward、先にプロデューサを更新して既存コンシューマを壊せない環境では Forward、双方を確実に守るには Full を選びます。
| モード | 比較対象 | 許容されやすい変更の例 | 主な用途 |
|---|---|---|---|
| BACKWARD | 最新のみ | フィールド追加(既定値あり)、型の昇格(int→long など) | 先にコンシューマ更新ができる環境 |
| BACKWARD_TRANSITIVE | 全履歴 | 上記を全履歴に対して満たす | 長期運用で強い保証が必要 |
| FORWARD | 最新のみ | 新フィールド追加(旧リーダは未知フィールドを無視)、フィールド削除(旧スキーマ側に既定値がある場合) | 既存コンシューマを更新できない環境で先にプロデューサ更新 |
| FORWARD_TRANSITIVE | 全履歴 | 上記を全履歴に対して満たす | 複数段のロールアウトに強い |
| FULL | 双方向(最新) | Backward と Forward の両条件を同時に満たす進化のみ許容 | 双方向に厳格な互換性が必要 |
| NONE | なし | 制約なし(破壊的変更も通る) | 検証・試験用途以外では非推奨 |
Confluent Schema Registry は Avro、Protobuf、JSON Schema をサポートします。いずれも REST API と互換性チェックの対象ですが、表現力やワイヤフォーマットの特性が異なります。サイズ効率やツールチェーン、スキーマ参照の有無などで選択します。
Confluent のシリアライザは、先頭にマジックバイト 0 と 4バイトのスキーマ ID を埋め込みます。これにより、コンシューマは受信時に ID からスキーマを引いて逆直列化できます。
高可用性のために Schema Registry を複数ノードで構成し、Kafka を利用したリーダー選出で書き込みを直列化します。スキーマは Kafka に複製されるため、バックアップは Kafka クラスタの耐障害性に依存します。
レイテンシを抑えるには、クライアント側のスキーマキャッシュを尊重し、新規スキーマの出現頻度を制御します。セキュリティ面では、ブローカー接続の SASL/SSL、Registry の mTLS、ACL、認可を組み合わせて制御します。
互換性モードの読み替えを間違えないことが最重要です。既存コンシューマを更新できない状況でプロデューサが先に新しいスキーマで送るなら Forward、逆にコンシューマを先に上げるなら Backward です。双方守るなら Full。
Subject 命名戦略やグローバル/サブジェクトの優先順位、ワイヤフォーマット(マジックバイトとスキーマ ID)も頻出です。エッジケースとして、型昇格の可否やデフォルト値の必要性はフォーマットに依存する点に注意してください。
CCDAK
問題 1
既存のコンシューマは当面更新できません。プロデューサが新しい任意フィールドを追加してイベントを書き始めても、既存コンシューマが新データを読み続けられるようにしたい。サブジェクトの互換性として最適なのはどれですか?
正解: A
要件は「旧リーダ(既存コンシューマ)が新データ(新ライタ)を読めること」で、これは Forward 互換に対応します。Backward は新リーダが旧データを読む保証、Full は双方向保証で要件より厳しく、None は無保証です。
グローバル設定とサブジェクト設定のどちらが優先されますか?
サブジェクト単位の互換性設定がグローバル設定を上書きします。まずサブジェクト設定を確認し、未設定の場合のみグローバルが適用されます。
Schema Registry がダウンした場合、プロデューサやコンシューマはどうなりますか?
既に解決済みのスキーマ ID を使う限り、直列化・逆直列化は継続できます。新規スキーマの登録や、未キャッシュの ID 解決が必要な場合は失敗します。
JSON を素のまま送るより JSON Schema を使う利点は何ですか?
スキーマの版管理と互換性チェック、バリデーションの仕組みを得られます。これにより API 変更の影響範囲が明確になり、破壊的変更を防止できます。
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-...