課題と前提
同一の利用イベントが運用上の制限と財務レポートの両方に利用されます。イベントは遅延、重複、あるいは修正される可能性があり、1つのノイズの多いテナントが他のテナントを遅延させたり、他テナントのデータを閲覧したりしてはなりません。
面接官がテストするポイント
- 不変の事実(ファクト)と可変のプロジェクションの分離。
- 冪等性、イベント時間ウィンドウ、修正、請求書の確定性の定義。
- テナント分離、バックプレッシャー、照合根拠の設計。
回答前の確認質問
- イベント発生レート、ディメンション、保持期間、請求書確定の期限はどのようになっていますか?
- 利用量はリクエストの受付時、完了時、あるいはビジネス上の効果が成功した時のどれで計測されますか?
- プロデューサーはイベントIDを再送信できますか?また修正や返金はどのように表現されますか?
- 秒単位の鮮度が必要なクォータ判断と、遅延が許容されるレポートはどれですか?
30秒の回答フレームワーク
安定したイベントID、イベント時間、単位、ソース、スキーマバージョンを持つ、テナントスコープの不変な利用ファクトを取得します。追記専用ログからクォータ用と請求用の独立したプロジェクションにデータを供給します。重複排除はテナントとイベントIDをキーとします。修正は上書きではなく新しいファクトとして扱います。クォータの読み取りは高速で境界のあるプロジェクションを使用し、請求書はウォーターマークと照合パスの完了後にのみ締め切ります。すべての集計はソースファクトまで追跡可能な状態を維持します。
ステップごとの詳細解説
1. ファクトの取得
プロデューサーを認証し、テナントスコープと単位を検証し、確認応答を返す前に生のイベントを永続化します。プロデューサーイベントID、ソース、イベント時間、計測バージョンを必須とします。不正な形式やテナントをまたぐ書き込みを拒否し、監査用のダイジェストを保持します。
2. 書き込みの冪等化
(tenant, source, event_id)に対して一意性制約を適用します。同じダイジェストを持つ重複は既存の結果を返します。異なるダイジェストはコンフリクトとして隔離されます。運用上の再試行は請求処理前に行われるため、請求書の行を冪等性ストアとして使用しないでください。
3. クォータと請求のプロジェクションを分離
クォータプロジェクションは短いウィンドウ、現在のカウンター、および鮮度が不明な場合のフェイルクローズポリシーを維持します。請求集計は契約上の単位と価格バージョンごとに行われ、イベント時間のバケットと修正リンクを保持します。どちらのプロジェクションも不変のファクトログを編集しません。
4. 遅延データの処理と請求書の締め切り
観測されたイベント時間と合意された遅延上限に基づくウォーターマークを使用します。ウォーターマーク後のイベントは調整元帳に入り、次の請求サイクルまたはクレジットワークフローに組み込まれます。確定前に、ログのカウントと合計をプロジェクションと照合し、計算バージョンを記録します。
5. 安全な運用
キューとストレージをテナントまたはフェアシェアキーでパーティショニングし、クォータとバックプレッシャーを適用し、デッドレターを分離します。取り込みラグ、重複・コンフリクト率、ウォーターマークの経過時間、プロジェクションの乖離、修正ボリューム、請求書締め切りレイテンシを監視します。データを暗号化し、エクスポートを制限し、すべての修正を監査可能にします。
質の高い模範回答
「確認応答を返す前に、イベントID、ソース、イベント時間、単位、スキーマ、価格バージョンを含む不変でテナントスコープの利用ファクトを保存します。追記専用ログからクォータ用と請求用の独立したプロジェクションにデータを供給します。同一ID・同一ダイジェストの再試行は冪等として扱い、ダイジェストが変更されたものは隔離します。クォータは高速で境界のあるプロジェクションを使用し、請求書は遅延ウォーターマークとソースファクトに対する照合の後にのみ締め切ります。遅延イベントは調整レコードとなり、テナントパーティショニング、バックプレッシャー、暗号化、乖離メトリクスによって正確性と公平性を保護します。」
よくある間違い
- イベントごとに集計を上書きする → 遅延データや修正が見えなくなる → 不変のファクトとプロジェクションを維持する。
- 実時間(ウォールクロック)の到着時刻を利用時間として使用する → 遅延したイベントが誤った請求書に計上される → イベント時間とウォーターマークでバケット化する。
- 1つのグローバルキューを共有する → ノイズの多いテナントが先頭ブロッキング(Head-of-line blocking)を引き起こす → パーティショニングまたはフェアシェアを適用する。
- 照合なしで確定する → プロジェクションの乖離が請求の紛争につながる → プロジェクションをソースファクトと比較し、計算にバージョンを付与する。
フォローアップの質問と回答
返金や修正はどのようにサポートしますか?
元のイベントと契約バージョンにリンクされた補償ファクトを追記します。影響を受けるプロジェクションを再計算するか、調整元帳エントリを作成します。元の証拠を決して変更してはなりません。
クォータと請求が一時的に一致しない場合はどうしますか?
鮮度と確定性の保証を個別に宣言します。クォータは境界のあるウィンドウ内で近似値をとることができ、請求はウォーターマークと照合チェックが通過するまで暫定的なままとなります。その状態をオペレーターと顧客に公開します。
あるテナントが別のテナントの利用量を閲覧するのをどう防ぎますか?
書き込みパス、ストレージパーティション、プロジェクションクエリ、エクスポート、サポートツール全体でテナントスコープを適用します。各境界で認可をテストし、機密性の高いイベントペイロードを含めずにアクセスをログに記録します。