代表的な面接トピック

データエンジニアリング面接:イベントフィールド名変更の安全なロールアウト

データ難しい
Offer.cc 編集チーム公開日 更新日

質問

注文イベントにおいて `total_cents` を `amount_minor` にリネームし、USD以外の通貨をサポートする必要があります。12のコンシューマーが個別にデプロイされ、90日間のデータがリプレイ可能です。名前と意味の変更をどのようにリリースしますか?

プロンプトとコンテキスト

この移行では、フィールド名とその意味の両方を変更します。total_cents はUSDを前提としていますが、amount_minor は明示的な通貨に対応する必要があります。Avroのエイリアスは名前の解決に役立ちますが、「セント」が正しく「通貨の補助単位(minor currency units)」に移行されたことを証明することはできません。

面接官が評価するポイント

  • プロデューサーが新しいフィールドに値を設定する前にリーダーを拡張すること。
  • 構造的な互換性と金額のセマンティクスを明確に分離すること。
  • 90日間のリプレイのために古いスキーマと変換処理を保持すること。
  • カレンダーの日付ではなく、コンシューマーの実態を示すエビデンスに基づいて廃止すること。

回答前の確認事項

フォーマット、レジストリのモード、未知のフィールドの扱い、金額の表現形式、通貨情報の有無、最も更新が遅いコンシューマー、およびリプレイサイクルを確認します。両方の意味を互換性を保って表現できない場合に v2 トピックが利用可能かどうかも質問します。

30秒の回答フレームワーク

まず、オプショナルの amount_minorcurrency を追加します。すべてのコンシューマーをアップグレードして新しいフィールドを優先し、total_cents にフォールバックするようにし、USDイベントについては同等性を検証します。その後、プロデューサーでデュアル書き込みを行い、新しいビジネスロジックが古いフィールドを読み取らないようにします。90日を超えて過去のスキーマと変換ロジックを保持します。古いフィールドの削除は、プロデューサーがその書き込みを停止し、コンシューマーおよびオフラインの依存関係がその読み取りを停止し、新しいスキーマで完全な90日間のリプレイが成功した後にのみ行います。

ステップバイステップの詳細解説

フェーズ1は加算的変更です。レジストリの互換性と CI のリーダー/ライターマトリックスにより、無効なバージョンをブロックします。新しいプロデューサーがデプロイされる前に、コンシューマーにデュアルリードのサポートを追加します。

フェーズ2ではデュアル書き込みを行います。USDには amount_minor == total_centscurrency == USD が必要です。USD以外のイベントには正しい新しいセマンティクスのみを設定します。カバレッジ、フォールバックの発生状況、不一致をプロデューサーのバージョン、コンシューマー、通貨ごとに追跡します。

フェーズ3では、リプレイ機能を維持しながら、古いフィールドへのビジネスロジックの依存を停止します。リプレイヤーは、現在のデフォルト値で履歴を解釈するのではなく、ライタースキーマIDに基づいて変換を選択します。単一のサブジェクトで両方の意味を安全に表現できない場合は、v2 トピックと明示的なトランスレーターを使用します。

すべてのプロデューサーが古い書き込みを停止し、フォールバックがゼロになり、完全なリプレイ期間が経過し、オフラインジョブの棚卸しが完了した後にのみ廃止します。いつでもデプロイ可能なロールバックスキーマと変換バージョンを保持しておきます。

優れた回答例

私は「拡張・移行・縮小(expand-migrate-contract)」アプローチを採用します。フィールドを追加してリーダーをアップグレードし、デュアルライトと調整を行い、すべての依存関係が移行したエビデンスが確認されてから古いフィールドを廃止します。エイリアスは名前の解決にしかなりません。通貨のセマンティクスにはコントラクトテストと実行時不変条件が必要です。

古いフィールドは完全なリプレイ期間が1回分経過するまで維持します。USDのデュアルライトで不一致が発生した場合、ロールアウトを凍結し、プロデューサーが修正される間はそのUSDバッチについて total_cents を正として扱います。USD以外のイベントでは amount_minor + currency を正とする必要があり、不正確なセント値を捏造するのではなく、新しいUSD以外の取り込みを一時停止するか v2 トピックにルーティングします。廃止後は、両方の新しいフィールドが実行時の必須不変条件になります。縮小(コントラクトの削除)は、オンライン、オフライン、およびリプレイのすべてのパスが閉じられた後にのみ開始します。

よくある間違い

  • 1回のスキーマコミットでフィールド名を変更してしまうこと。
  • エイリアスを金額の変換として扱ってしまうこと。
  • コンシューマーより先にプロデューサーをデプロイしてしまうこと。
  • 過去の履歴を現在のデフォルト通貨で読み取ってしまうこと。
  • オフラインおよびリプレイのコンシューマーを見落とすこと。

フォローアップ質問

なぜエイリアスだけでは不十分なのですか?

フィールド名の解決には役立ちますが、セントと他の通貨の補助単位が等しい意味を持つことを証明するものではないためです。

v2 トピックが必要になるのはどのような場合ですか?

要求される互換性契約のもとで、古い意味と新しい意味を曖昧さなく表現できない場合です。

デュアルライトで不一致が発生した場合はどうしますか?

USDのデュアルライトの場合、ロールアウトを停止し、影響を受けるバッチについては total_cents を正として扱い、プロデューサーのバージョンごとに隔離して修正し、リプレイします。USD以外の場合は amount_minor + currency を正とし、取り込みを一時停止するか v2 トピックを使用します。偽のセント値にフォールバックしてはなりません。

古いフィールドはいつ削除できますか?

古い書き込みが停止し、フォールバックがゼロになり、完全なリプレイ期間が経過し、オフラインの棚卸しが完了した後に削除できます。

公開情報ソース

関連する質問