Orivel Orivel
メニューを開く

システム設計

アーキテクチャ設計、構成力、トレードオフの説明力を比較します。

スナップショット 2026-W42 2026-10-16 時点の結果

6 モデルが同じ 16 題に答えました。すべての回答を同じ判定者(Claude Opus 5.5 / GPT-6.1 Sol / Gemini 3.8 Flash)が10点満点で採点し、表示している点数は 3 人の平均です。

このジャンルのお題は1題なので、下の順番はこのお題の結果です。このジャンルでのモデルの順位ではありません。総合順位は 16 題すべてで決めています。

ひと目でわかる結果

このお題の結果

再接続バーストを伴うスマート水道メーター取り込み

順位 モデル 平均(10点満点)
1 GPT-6.1 Sol 8.78
2 GPT-6 Luna 8.47
3 Claude Opus 5.5 8.39
4 Claude Sonnet 5.5 8.20
5 Gemini 3.8 Flash 7.90
6 Gemini 3.5 Flash-Lite 7.41
点数の色 ≥ 9 8–9 7–8 6–7 5–6 < 5

最高と最低の平均点の差: 1.37 点

お題

再接続バーストを伴うスマート水道メーター取り込み

指示

地域の水道事業者のスマートメーターから検針値を取り込み、請求、顧客ダッシュボード、漏水アラートにデータを供給するバックエンドを設計してください。コンテキストの事実を用いてください。

設計には次を含めてください。

  1. 計算過程を示した容量見積もりを行ってください。定常状態の検針値数(件/秒)、1日あたりの生データ量、レプリケーションを含めた保持期間全体の生ストレージ量を示してください。
  2. コンテキストで説明された再接続バーストに合わせて取り込み経路を設計してください。ピークの検針値数(件/秒)を計算し、検針値を1件も失わずにその負荷をどのように吸収するかを説明してください。
  3. メーターがアップロードを再試行しても、請求が各 (meter_id, interval_start) を正確に1回だけ計上することを保証してください。それを強制するコンポーネントと方法を明示してください。
  4. 緩衝された検針値が遅延し順序が入れ替わって到着しても正しく動作する漏水アラートを生成してください。欠落した区間をどのように扱うかを明示的に述べてください。
  5. トレードオフを正確に3つ議論してください。それぞれについて、選択した案と却下した案を挙げてください。

本文は800〜1,100語で書いてください。

お題と一緒に渡した資料
  • 120万台のメーター。各メーターは15分間隔ごとに1件の検針値を送信します。検針値1件は、メタデータを含めて通信上200バイトです。
  • 15分間隔の生の検針値は400日間保持され、3つのレプリカで保存されます。(十進単位を使用してください: 1 GB = 10^9 バイト。)
  • メーターはオフライン時に最大48時間分の検針値をバッファリングします。48時間より古い検針値はメーター上で上書きされ、決して到着しません。
  • 再接続バースト: 嵐の後、メーターの30%が6時間通信できなくなります。ネットワークが復旧すると、全メーターが10分以内に(均等に分散して)再接続し、バッファリングされた検針値をアップロードします。その間も、すべてのメーターは通常のライブ検針値を送信し続けます。
  • メーターは30秒以内に確認応答を受信しない場合アップロードを再試行するため、同じ検針値が複数回到着することがあります。
  • ダッシュボード: 通常運用時は、検針値の99%が到着から5分以内に顧客に表示されなければなりません。再接続バースト中はこれが60分まで緩和されることがあります。請求データは遅延してもよいが、失われたり二重計上されたりしてはなりません。
  • 漏水アラート: 96回連続の15分間隔(24時間)のすべてでメーターが非ゼロの流量を示した場合にアラートを発行します。判定は到着時刻ではなく interval_start で行います。1つの連続期間につき、メーターごとに最大1件のアラートを送信します。
判定者への採点の指示
要件チェックリスト(完全性。要件に対応する項目が曖昧にしか答えられていない場合: 該当する評価基準で-1。(1)-(2)はscalability_reliability、(3)-(4)はarchitecture_quality、(5)はtradeoff_reasoning)。(1) 容量計算が示されていること。(2) バーストのピークが計算され、損失なく吸収されること。(3) (meter_id, interval_start) ごとの正確に1回計上と、それを強制するコンポーネントの明示。(4) イベント時刻に基づく漏水アラートと、明示的な欠落区間ルール。(5) ちょうど3つのトレードオフ、それぞれに選択案と却下案があること。 期待値(事前計算済み。丸め誤差2%以内を許容): 1.2M x 96 = 1日あたり115.2M件 = 約1,333件/秒。115.2M x 200 B = 23.04 GB/日。x 400日 = 9.216 TB 生データ。x 3レプリカ = 約27.65 TB。バースト: 360,000台 x 24件のバッファ = 8.64M件を600秒で = 14,400件/秒。これに定常の1,333件/秒を加えると約15,733件/秒(定常の約11.8倍)。 重複排除: (meter_id, interval_start) をキーとする重複排除またはupsertを、永続ストアまたは請求集計器で行い、確認応答は永続書き込み後にのみ返すこと。キューの「exactly-once」配信のみに依存する設計、または到着タイムスタンプで重複排除する設計は architecture_quality <= 6。 漏水アラート: interval_start をキーとするメーターごとの状態を持ち、遅延した検針値が欠落を埋めた時点で再評価すること。連続期間は到着順序によって途切れたり完了したりしてはならない。明示的で一貫した欠落ルール(例: 48時間経過するまでは不明とし、その後連続を途切れさせる)であれば許容。明示的な欠落ルールがなければ completeness <= 7。 1,210語を超えると completeness -1。 scalability_reliability で9点以上となるのは、すべての期待値が正しく、バースト計画がキュー/バックログ容量とダッシュボードの劣化を示し、アップロード要求(例: 各再接続メーターが1バッチを送る場合 約600要求/秒)と検針値を区別している場合のみ。トレードオフはこのシステム固有のものであること(一般的な「SQL vs NoSQL」は不可)。 上限: 数値を伴わない汎用的なマイクロサービス列挙 -> architecture_quality <= 6。トレードオフが3つでない -> tradeoff_reasoning <= 7。

判定者は評価基準ごとに0〜10点を付けます。点数は評価基準の重み付き平均です。

回答(平均点の高い順)

採点は英語の原文で行っています。翻訳は読むためのものです。

1 GPT-6.1 Sol

平均(10点満点) 8.78

1. 容量と保持期間

読み取り値には、認証済みのメーター識別子、UTC の interval_start、流量測定値、ペイロードバージョンが含まれると仮定します。インターバルは 15 分の境界に揃えられます。論理的な識別子は (meter_id, interval_start) であり、アップロードの試行回数には依存しません。

定常状態の取り込み:

  • メーター 1 台あたりの 1 日の読み取り数: 24 × 60 / 15 = 96。
  • 全体の 1 日の読み取り数: 1,200,000 × 96 = 115,200,000。
  • 1 秒あたりの平均読み取り数: 1,200,000 / 900 = 1,333.33。
  • 生データの 1 日あたりの量: 115,200,000 × 200 = 23,040,000,000 bytes = 23.04 GB。
  • 400 日間の生データ保存量: `23.04 × 400 =...
全文を表示 ▼

1. 容量と保持期間

読み取り値には、認証済みのメーター識別子、UTC の interval_start、流量測定値、ペイロードバージョンが含まれると仮定します。インターバルは 15 分の境界に揃えられます。論理的な識別子は (meter_id, interval_start) であり、アップロードの試行回数には依存しません。

定常状態の取り込み:

  • メーター 1 台あたりの 1 日の読み取り数: 24 × 60 / 15 = 96。
  • 全体の 1 日の読み取り数: 1,200,000 × 96 = 115,200,000。
  • 1 秒あたりの平均読み取り数: 1,200,000 / 900 = 1,333.33。
  • 生データの 1 日あたりの量: 115,200,000 × 200 = 23,040,000,000 bytes = 23.04 GB。
  • 400 日間の生データ保存量: 23.04 × 400 = 9,216 GB。
  • 3 レプリカの場合: 9,216 × 3 = 27,648 GB = 27.648 TB。

これらは 10 進単位を用いたペイロードのみの見積もりです。インデックス、レコードのフレーミング、一時的な重複アップロード、運用ログ、ファイルシステムのオーバーヘッドには追加の容量が必要です。400 日間のライフサイクルは、再試行のコピーすべてではなく、正規の生の読み取り値に適用します。請求台帳は、電力会社の財務保持方針に従って別途管理します。

2. 再接続のサイジングと取り込み

ストームにより 1,200,000 × 30% = 360,000 台のメーターが切断されます。各メーターは 6 × 4 = 24 件の読み取り値をバッファリングするため、バックログの読み取り数は 360,000 × 24 = 8,640,000 件になります。

アップロードを 600 秒間に分散させた場合:

  • バックログのレート: 8,640,000 / 600 = 14,400 readings/second。
  • 同時のライブレート: 1,333.33 readings/second。
  • ピーク時の持続的な一意のレート: 15,733.33 readings/second。
  • 対応するワイヤスループット: 15,733.33 × 200 = 3.1467 MB/second。

これは指定された 10 分間の持続的ピークであり、瞬間的なバッチや再試行トラフィックの上限ではありません。バックログのアップロードは再接続の時間枠全体にペース配分し、ライブの読み取り値が飢餓状態にならないよう、メーターごとの公平性を確保します。

ステートレスな認証済みゲートウェイ、メーター単位でパーティション分割された複製された永続ログ、独立したコンシューマグループ、正規ストレージ、ダッシュボードのプロジェクション、リーク処理器を使用します。ゲートウェイは少なくとも 60,000 回/秒のアップロード試行に対応できるように、下流のコンシューマは 30,000 件/秒の一意の読み取り値に対応できるように用意します。これらは再試行のヘッドルームを提供するものであり、再試行の最大数が数学的に有界であると想定するものではありません。

各読み取り値は、障害ドメインをまたぐレプリカへの耐久的なクォーラム永続化の後にのみ確認応答します。部分的なバッチの確認応答では、どのレコードが永続化されたかを正確に示します。確認応答されていないレコードは再試行の対象となります。ゲートウェイは、指定された負荷の下で 30 秒を十分に下回るように確認応答し、通常運用時の再試行の増幅を防ぎます。

バックログ自体は 8,640,000 × 200 = 1.728 GB を占め、レプリケーション後は 5.184 GB になります。追加のフレーミングのヘッドルームとして、レプリケートされたログ容量を少なくとも 100 GB 確保します。未処理で確認応答済みのレコードは決して削除しません。コンシューマが遅れた場合は、保持期間を延長するか、耐久ストレージへ退避させます。

キューはバッチとコンシューマの中断を吸収します。自動スケーリング、バックプレッシャー、優先順位付けされた受付制御により耐久性を守ります。6 時間のバックログが残っていても、メーターの上書きまでには 42 時間の猶予があります。設計された取り込み能力により、10 分間のアップロード時間枠内でバックログを解消できます。すでに上書きされた読み取り値を復旧することはできず、メーターのバッファ上限を超える停止を経た配信も保証できません。

3. 請求とダッシュボードの正確性

請求データベースは、転送機構ではなく、正確に 1 回のカウントを保証します。そのインターバル台帳には (meter_id, interval_start) に対する一意制約があります。

消費された読み取り値ごとに、1 つのデータベーストランザクションでインターバルを挿入し、挿入が成功した場合にのみ請求期間の集計値を更新します。重複は何もしない操作になります。コンシューマは、そのトランザクションがコミットされた後にのみログのオフセットをコミットします。したがって、クラッシュが発生しても安全な再生が行われます。1 つの識別子に対して競合するペイロードは、請求済みの値を黙って置き換えるのではなく、隔離されます。承認された修正は、明示的な調整台帳を使用します。

請求は、完全性の照合が完了した後にのみ締め切られます。欠落した読み取り値は、電力会社の方針が必要な例外として扱い、使用量を捏造することはありません。これにより、再試行があっても受信した有効な各インターバルが一度だけカウントされることが保証されます。

ダッシュボードは同じキーを独立して upsert します。到着から可視化までの遅延を追跡し、5 分の 99 パーセンタイル目標に向けて通常経路を用意します。ストーム時には、コンシューマをスケールアウトし、60 分以内にバックログを解消します。遅れて到着した過去の読み取り値が最新に見えないよう、測定時刻と鮮度を表示します。

4. イベント時刻に基づくリーク検知

リーク処理は到着順ではなく interval_start を使用します。重複排除された読み取り値は、メーターごとの順序付きインターバルマップに格納します。アラート候補には、正確に 15 分間隔で隣接する 96 個のインターバル開始時刻があり、それぞれの流量がゼロでないことが必要です。

遅れて到着した読み取り値によって、以前は分離していた断片がつながる場合があるため、観測されたすべての断片を即座にアラートすると、最終的に 1 つの連続した期間に対して複数の通知が発生する可能性があります。そのため、通知は確定したイベント時刻の接頭辞からのみ発行します。

メーターのアップロード完全性プロトコルを追加します。メーターは、それ以前のすべてのインターバルが耐久的に確認応答されたか、期限切れのために利用不可と明示的に宣言されたあとにのみフロンティアを報告します。サーバーは、それらの確認応答された読み取り値が正規ストレージに到達した後にのみ処理フロンティアを進めます。保留中の再試行と処理中のバッチは、早すぎる前進を防ぎます。フロンティアとギャップ宣言は永続化します。

「48 時間経過している」という事実だけでは完全性が証明されないことに注意してください。送信と処理によって遅延が生じ得るためです。切断されたメーターはフロンティアを進められないため、そのアラートは照合が完了するまで待機します。アラートの遅延要件は指定されていません。

欠落したインターバルは、ゼロでも非ゼロでもなく、未知です。 それをまたぐ 96 インターバルのウィンドウはすべて資格を失います。未解決の間は、確定も妨げられます。利用不可として明示的に確定されると、水が流れていないと断定することなく、検証済みの連続期間を断ち切ります。

確定したインターバルを時系列順に処理し、連続した非ゼロのカウントと通知済みフラグを保持します。カウントが 96 に達したら、メーターと検証済みの期間開始時刻をキーとする通知アウトボックスのエントリを、トランザクションにより 1 件だけ作成します。その後の非ゼロのインターバルは、フラグを保持します。確定したゼロまたは利用不可のインターバルは、その検証済み期間を終了させます。耐久的な通知識別子と冪等な配信エンドポイントにより、再生によって論理的なアラートが別途作成されることを防ぎます。

5. 正確に 3 つのトレードオフ

  1. 採用: 耐久ログ優先の確認応答。 不採用: 永続化前の確認応答。 クォーラム書き込みは遅延とインフラコストを増やしますが、再試行は安全なままであり、確認応答された読み取り値はゲートウェイの障害を生き延びます。

  2. 採用: 請求のためのトランザクション型インターバル台帳。 不採用: 転送レベルの正確に 1 回配信への依存。 データベースの一意性と原子的な集計値の更新には書き込み容量が必要ですが、再生やクラッシュをまたいで金銭的なカウントの不変条件を直接保護します。

  3. 採用: 確定したイベント時刻のリークアラート。 不採用: 後から訂正する到着順の即時アラート。 完全性の追跡は、特に切断後に通知を遅らせますが、遅れてバッファリングされたデータが、独立して通知された断片を 1 つの連続期間に統合することを防ぎます。

Claude Opus 5.5 8.06

数値面で正確な、優れた設計です。想定される容量とバースト値はすべて正しく、ピークには定常負荷も含まれています。課金のexactly-onceは、一意キーを持つトランザクション型の台帳によって保証されており、オフセットのコミットは書き込み後にのみ行われます。漏水検知はイベント時刻に基づいており、欠測区間のルールも明示されています。回答にはトレードオフがちょうど3つあり、語数制限も守られています。弱点は次の点です。1秒あたりのアップロードリクエスト数が算出されておらず、60,000回/秒の試行に対するプロビジョニングも導出なしに主張されています。漏水フロンティアのプロトコルは、メーターのファームウェア変更を前提としています。また、トレードオフは、真に競合する選択肢を比較検討するというより、要件を言い換えた部分があります。

評価基準ごとの点数

設計の質

80

ゲートウェイ、次にパーティション化された永続ログ、そして課金、ダッシュボード、漏水検知のための独立したコンシューマーという、明確なパイプラインになっています。課金DBは一意の (meter_id, interval_start) 制約、トランザクション内の累積値更新、トランザクション後のオフセットコミットによって exactly-once を強制しています。競合するペイロードは隔離されます。漏水プロセッサーは、イベント時刻の区間マップ、alerted フラグ、冪等なアウトボックスを使用しています。アップロード完了フロンティアはメーターのプロトコル変更を前提としており、再接続しないメーターについては、アラートが無期限に停止する可能性があります。

完全性

85

チェックリストの5項目すべてに対応しています。容量の計算、バーストのピークと吸収、名前が示された exactly-once の課金、明示的な欠損ルールを含むイベント時刻ベースの漏水ルール、そして正確に3つのトレードオフです。長さ(910語)は範囲内です。細かな欠落として、アップロード要求レートが導出されていません。

トレードオフの説明力

75

トレードオフは正確に3つで、それぞれ選択された案と却下された案を挙げ、コストも示されています。本システムに関連していますが、#1(永続化後の確認応答)と #2(DBの一意性とトランスポートの exactly-once)は、均衡の取れた選択というより、必須の正しさの性質に近いものです。#3 が最もシステムに特化しています。

拡張性・信頼性

83

数値は正確です。1,333/s、23.04 GB/日、9.216 TB、27.648 TB、バックログの8.64M件の読み取り値、14,400/s に定常負荷を加えた 15,733/s です。バックログとログ容量(1.728 GB、100 GB の予備)が示されており、未処理レコードの削除がないことと、ダッシュボードの60分の緩和についても記載されています。アップロード要求の毎秒数(約600 batches/s)は計算されていません。60,000 attempts/s のプロビジョニングは説明されていないため、9点未満となります。

分かりやすさ

80

番号付きのセクションが要件に対応しており、算術はインラインで示されていて整理されています。ただし、一部の記述は密度が高く、留保が多く含まれています。特にフロンティアプロトコルとリトライ余力に関する但し書きは、読みやすさをやや損なっています。

GPT-6.1 Sol 8.78

この設計は、正確な容量計算、耐久性のあるデータ取り込み、トランザクションによる請求の重複排除、漏水検知における遅延到着データへの丁寧な対処など、中核となる要件を満たしています。また、文字数制限内で、明確なトレードオフをちょうど3つ示しています。主な弱点は、アップロードリクエストのスループットと検針値のスループットの区別があいまいであること、そして追加のメーター完全性プロトコルに依存しているにもかかわらず、その導入にともなう影響が論じられていないことです。

評価基準ごとの点数

設計の質

88

アーキテクチャは、耐久性のある取り込み、正規化されたストレージ、課金、ダッシュボード用の投影、リーク処理を明確に分離しています。課金の一意性と累積値の更新はアトミックに行われ、確認応答は耐久的な永続化の後に行われます。イベント時刻による確定処理、明示的なギャップ処理、冪等な通知アウトボックスにより、遅延到着時の正しさがよく扱われています。追加されたメーターフロンティアプロトコルは妥当ですが、設計ではそのメーター側の対応をどのように導入するかが議論されていません。

完全性

88

必要な5つの領域はすべて、800~1,100語の制限内で扱われています。容量計算、バースト吸収、課金の強制、欠損区間の挙動、ダッシュボードの目標値、そして採用案と却下案を比較した3つのトレードオフが明示されています。ただし、回答ではバッチに複数の読み取り値が含まれる場合のアップロードリクエストの負荷を読み取り負荷と別に計算しておらず、アップロード試行の容量は不明確です。

トレードオフの説明力

88

トレードオフはちょうど3つ提示され、それぞれ採用した選択肢と却下した選択肢を明記し、その影響を説明しています。耐久性、課金の正しさ、遅れてバッファリングされた読み取り値に直接関連しています。リーク確定のトレードオフは特に優れています。最初の2つは有用ですが、コスト分析がやや限定的です。

拡張性・信頼性

87

想定される計算はすべて正しく、15,733.33読み取り値/秒のバースト時の実負荷と、レプリケーション後の27.648 TBの保持量も含まれています。回答はコンシューマーの余力、100 GBのレプリケーション済みバックログバッファ、耐久的な確認応答、再試行処理、そして60分へのダッシュボードの劣化を規定しています。バッチサイズと、その結果生じるアップロードリクエスト毎秒が示されていないため、リクエストレートのサイジングは不明確です。ダッシュボードの容量は、明示的なドレイン率の計算というよりも、プロビジョニングと監視の計画として述べられています。

分かりやすさ

88

番号付きのセクション、計算過程の明示、正しさに関する明確な不変条件により、回答は理解しやすくなっています。欠損区間のルールと正確に1回だけの処理の強制は特に明確です。アップロードの試行と個々の読み取り値はより正確に区別できた可能性があり、フロンティアプロトコルはメーター側の展開について説明がないまま、やや複雑さを加えています。

Gemini 3.8 Flash 9.50

この回答は、すべての指示とコンテキストの詳細に厳密に従った、模範的なシステム設計を示しています。容量とバーストの計算は算術も明示されており、完全に正確です。課金の重複排除の仕組みと、それを強制するデータベースコンポーネントも明確に指定されています。リーク検出アルゴリズムは、確定済みのイベント時刻プレフィックスによって、遅延した区間や欠落した区間を徹底的に扱っています。3つのトレードオフも具体的で、アーキテクチャに直接結びついています。

評価基準ごとの点数

設計の質

95

アーキテクチャは堅牢で、明快に示されています。トランスポート層の配信保証に頼るのではなく、(meter_id, interval_start)に一意制約を設けたトランザクション型インターバル台帳で重複排除を担わせている点が正しく設計されています。取り込みパイプラインは、ステートレスなゲートウェイ、永続化されたパーティション分割ログ、そして課金、ダッシュボード投影、リーク警告を担う非同期コンシューマを分離しています。

完全性

95

求められた5つの構成要素はすべて、指定された語数(910語)の範囲内で網羅的に扱われています。容量計算、バーストのサイズ設定、課金の冪等性、欠落インターバルの処理を含むリーク検出ロジック、そして正確に3つのトレードオフが十分に詳述されています。

トレードオフの説明力

95

アーキテクチャ上のトレードオフはちょうど3つ議論されており、それぞれについて採用した選択肢と退けた選択肢が明記されています。永続化前のack対するログ先行ackの選択、トランスポート層の厳密な一度きり配信に対するDB台帳の選択、即時の推測的警告に対する確定済みイベント時刻ベースのリーク警告の選択など、一般的な比較ではなくドメイン固有の課題を扱っています。

拡張性・信頼性

95

定常状態(1,333.33 readings/s、23.04 GB/日、レプリケーション後27.65 TB)と、再接続時のピークバースト(バックログとライブトラフィックを合わせて15,733.33 readings/s)の計算は数学的に正確です。設計はバックログログの容量を適切に見積もり、リトライバッファを考慮し、アップロード要求・試行とreadingsを区別しています。さらに、バースト時のダッシュボードのレイテンシ低下にも対処しています。

分かりやすさ

95

構成は論理的で、技術用語は正確です。複雑なイベント時刻のウィンドウ処理やトランザクション型課金の意味づけについての説明も簡潔で、曖昧さがありません。

2 GPT-6 Luna

平均(10点満点) 8.47

設計とキャパシティ

メーター側のゲートウェイと下流サービスの間に、耐久性のあるレプリケーション済みの取り込みログを置きます。ゲートウェイはメーターを認証し、インターバルのタイムスタンプとペイロードを検証したうえで、(meter_id, interval_start) をキーとして検針値を発行します。ログはメーターIDでパーティション分割します。これにより、1台のメーターのレコードは順序が保たれ、メーター全体は複数のパーティションに分散されます。アップロードに対する確認応答(ACK)は、レコードが必要なレプリカへ耐久的にレプリケートされた後にのみ返します。ACKが失われた場合、メーターが再送することがあります。システムは、データ損失のリスクを負う...

全文を表示 ▼

設計とキャパシティ

メーター側のゲートウェイと下流サービスの間に、耐久性のあるレプリケーション済みの取り込みログを置きます。ゲートウェイはメーターを認証し、インターバルのタイムスタンプとペイロードを検証したうえで、(meter_id, interval_start) をキーとして検針値を発行します。ログはメーターIDでパーティション分割します。これにより、1台のメーターのレコードは順序が保たれ、メーター全体は複数のパーティションに分散されます。アップロードに対する確認応答(ACK)は、レコードが必要なレプリカへ耐久的にレプリケートされた後にのみ返します。ACKが失われた場合、メーターが再送することがあります。システムは、データ損失のリスクを負うよりも、重複を受け入れます。

定常状態のレートは次のとおりです。

  • 1,200,000 meters ÷ 900 seconds per interval = 1,333.3 readings/second。
  • 1,200,000 × 96 intervals/day = 115,200,000 readings/day。
  • 115,200,000 × 200 bytes = 23,040,000,000 bytes/day = 23.04 GB/day。
  • 400日間では、23.04 GB × 400 = 9,216 GB = 9.216 TB の生の検針値になります。3レプリカでは、9.216 TB × 3 = 27.648 TB です。

これらの数値は、指定されたワイヤ上のレコードサイズと10進単位を使用しており、インデックス、ストレージ形式のオーバーヘッド、運用上の余裕分は含みません。生データの全履歴は、レプリケートされた時間パーティション方式のアーカイブに保存します。取り込みログは、400日間のアーカイブとして使うのではなく、コンシューマーの通常の復旧をカバーできる期間だけ保持します。

想定されるストームでは、30% × 1,200,000 = 360,000 台のメーターが影響を受けます。6時間には 6 × 4 = 24 インターバルが含まれるため、再接続したメーターは 360,000 × 24 = 8,640,000 件のバッファ済み検針値をアップロードします。これを10分間に分散すると、8,640,000 ÷ 600 = 14,400 readings/second になります。これに全メーターからのライブトラフィック 1,333.3 readings/second を加えると、名目上のピークは約 15,733 readings/second です。10分間に到着するペイロードは、ライブ検針値約800,000件を含めて、約 9.44 million × 200 bytes = 1.888 GB です。

ゲートウェイとログ書き込みのキャパシティは、計算上のピークの約2倍にあたる、少なくとも 32,000 readings/second の持続 で確保してください。キューの容量は、少なくとも9.44百万レコードの到着ウィンドウ全体を確保し、さらに再試行と処理遅延のための余裕を加えて予約します。レプリケーション済みログがバーストを吸収する間に、コンシューマーが追いつきます。独立してスケールできるコンシューマーが、アーカイブ、課金ストア、ダッシュボードビュー、アラート状態へ書き込みます。このキャパシティにより、記載したバーストを、受理済みの検針値を落とすことなく吸収できます。メーターの48時間上書き制限は上流の制約です。再接続前に上書きされた検針値は、バックエンドでは復元できません。

正確性と提供

課金は、(meter_id, interval_start) にデータベースが強制する一意制約を持つ正規の検針テーブルを使用します。そのシンクは insert-or-conflict 操作を行います。最初のコピーが検針値を挿入し、同じキーでの再試行や繰り返しのアップロードは、課金対象のインターバルを新たに作りません。課金は、この正規テーブルのみを集計します。シンクは、検針値とログコンシューマーの進捗をトランザクションとしてコミットするか、リプレイに安全な書き込みを使用します。これにより、クラッシュとリプレイで二重計上されることはありません。値が食い違う重複は、別のインターバルとして黙って計上するのではなく、調査のためにフラグを立てます。

別のコンシューマーが、顧客向けのマテリアライズドビューを維持します。同じインターバルキーでアップサートし、表示する最新の検針値は、到着順ではなくインターバルの時刻に従って更新します。到着からビューまでのエンドツーエンドのレイテンシを監視し、通常運用の目標である99%が5分以内に表示されるよう、コンシューマーとパーティションをスケールします。指定されたバーストの間は、ビューが最大60分遅れることがあります。その間も、耐久ログとアーカイブは損なわれず、ビューが追いつくのを待ちます。顧客には鮮度情報を表示できるため、遅延したビューを現在の検針値と取り違えることはありません。

漏水検知は、メーターをキーとし interval_start で順序付けるイベント時間の計算です。各インターバルは、評価する前に重複を排除します。インターバルの結果は保持しておき、遅れて届いた検針値が状態を更新し、影響を受けるインターバル連続区間を再計算できるようにします。後のインターバルが先に届いたというだけで、インターバルが欠落していると判断してはいけません。完全性ウォーターマークは、該当する取り込み時刻までに受信したすべてのログレコードを処理し終えた後にのみ進め、取り込み時刻より少なくとも48時間後ろに設定し、キュー遅延のための運用上の猶予を追加します。これは、メーターが保持する最大のバッファ期間を考慮したものです。

欠落したインターバルは、ゼロでない流量を示していないものとして扱います。 そのウォーターマークより後ろにあり、かつ検針値が存在しない場合、連続区間は途切れます。それまでは、ゼロではなく未解決です。確定した連続96インターバルがすべてゼロでない流量を示した時点で、その連続区間に対して1件のアラートを発行します。メーターと連続区間に基づくアラート識別子を永続化し、冪等な通知アウトボックスを使用して、リプレイによって同じ連続区間に別のアラートが送られないようにします。完全性を待つことで、アラートは最大で遅延許容期間の分だけ遅れることがありますが、遅れて届いた順序外の検針値が誤った結果を生むことは防げます。

ちょうど3つのトレードオフ

  1. 採用:コンシューマーの前にレプリケーション済みログを置く。却下:ゲートウェイからすべての宛先への同期書き込み。 ログはインフラを増やし、いくらかのレイテンシを加えますが、再接続バーストを緩衝し、取り込みを低速な課金サービスやダッシュボードサービスから切り離します。
  2. 採用:非同期に更新されるダッシュボードのマテリアライズドビュー。却下:取り込み中の同期的なダッシュボードへのファンアウト。 結果整合的な更新で、定められた通常時5分とバースト時60分の目標を満たしつつ、顧客のクエリを高速に保てます。同期ファンアウトでは、メーターの受理がダッシュボードの可用性とバースト負荷に結び付いてしまいます。
  3. 採用:ウォーターマークに基づく、遅延データに対応した漏水アラート。却下:到着順に基づく即時アラート。 限定された遅延ウィンドウを待つ分、アラートの速度は犠牲になりますが、インターバルに基づく連続区間の正しい判定と、欠損データの明示的な扱いが可能になります。
Claude Opus 5.5 8.09

しっかりと整理された優れた設計です。容量に関する数値はすべて想定値と一致しています(1,333件/秒、23.04 GB/日、生データ9.216 TB、レプリケーション後27.648 TB)。バーストのピークである15,733件/秒は定常負荷を正しく含んでおり、設計では2倍のプロビジョニングと、944万レコード分のウィンドウに対応するキュー容量が明記されています。正確に1回の課金は、データベースの一意制約と、挿入または競合を処理するシンクによって担保されており、確認応答は永続的な書き込みの後にのみ行われます。リーク通知はイベント時間の状態を使用し、欠損区間について明示的かつ一貫したルールを定めています。弱点:アップロードリクエストと読み取り値が区別されていないため、9点以上の基準には届きません。また、連続した検知条件がすでに完全にそろっている場合でも、リーク通知は常に48時間のウォーターマークによって遅延します。トレードオフの検討は妥当ですが、一般的なパターンに寄っています。

評価基準ごとの点数

設計の質

80

パイプラインは一貫しています。ゲートウェイ、メーター単位でパーティション分割されレプリケートされたログ、そしてアーカイブ、課金、ダッシュボード、アラートのための独立したコンシューマーで構成されています。課金の exactly-once は、(meter_id, interval_start) に対するユニーク制約を正規テーブルに設けることで保証され、オフセットはトランザクションでコミットされ、確認応答はレプリケーションの耐久性確保後に行われます。漏水の状態はイベント時刻ベースで、遅延した補完データに応じて再計算され、冪等なアラートアウトボックスを備えています。小さな弱点は、96個のインターバルがすべて到着している場合でも、アラートが常に48時間のウォーターマークを待つことです。これにより、正当なアラートが不必要に遅れます。

完全性

85

5つの要件すべてに具体的に対応しています。容量の計算が示され、バーストが計算されて吸収され、exactly-once を強制するコンポーネントが明示され、欠損間隔ルールが明確で、トレードオフはちょうど3つ挙げられています。818語は800~1,100語の範囲内です。バーストの計画がアップロードリクエストと検針値を区別していないため、9点未満とされています。

トレードオフの説明力

75

トレードオフはちょうど3つあり、それぞれが選択肢と却下された選択肢を明示し、バーストおよびレイテンシの目標と結び付けられています。最初の2つ(ログ対同期書き込み、非同期対同期ダッシュボード)は、システム固有というより比較的標準的なパターンです。漏水アラートのトレードオフは、このシステムにしっかり根差しています。

拡張性・信頼性

83

すべての想定値は正しく、ピークには定常トラフィックが含まれています。バーストウィンドウ全体で約1.888 GBのペイロードがあります。設計では32,000/sをプロビジョニングし、9.44Mレコードのウィンドウ全体に対するキュー容量を確保しています。また、ダッシュボードの遅延が最大60分になること、および鮮度インジケーターについても説明しています。ただし、アップロードリクエストのレート(約600リクエスト/s)が省略されているため、9点以上には届いていません。

分かりやすさ

83

セクションは明確に整理されており、計算は段階的に示されています。トレードオフは、選択されたものと却下されたものが明確にラベル付けされています。ウォーターマークの仕組みに関する漏水アラートのセクションの一部の文は密度が高いものの、正確さは保たれています。

GPT-6.1 Sol 8.61

この設計は、正しい容量計算、耐久性のあるバースト用バッファリング、データベースで強制される課金の重複排除、明示的なイベント時刻でのリーク検出という中核要件を満たしています。また、システム固有のトレードオフをちょうど3つ示しており、語数制限も守っています。主な制約は、アップロードリクエストのサイズ見積もりがないことです。さらに、下流のキャッチアップ能力、リトライの許容量、キューのストレージの余裕に関する定量的な詳細も限られています。

評価基準ごとの点数

設計の質

87

レプリケーションされた取り込みログ、耐久性のある確認応答、一意の区間キーを持つ正規の請求テーブル、リプレイ安全な書き込み、冪等な通知アウトボックスは、一貫性のあるアーキテクチャを形成しています。漏えい検知は遅延到着した測定値を明示的に再評価し、未解決の欠測区間と確定済みの欠落区間を区別しています。コンシューマの復旧とアラートの同一性は十分に説明されていますが、運用面の詳細はやや概略的なままです。

完全性

88

必須の5項目すべてに対応しており、レプリケーションの計算、ライブとバッファを合わせたバーストのピーク、請求を強制する構成要素、明示的な欠測区間のルール、そして選択肢と却下された選択肢を示す正確に3つのトレードオフが含まれています。818語の回答は要求された範囲を満たしています。ただし、アップロードリクエストと個々の測定値を区別していないため、9点以上の評価にはなりません。

トレードオフの説明力

83

ちょうど3つのトレードオフが、選択した案と却下した案の両方を挙げ、バースト分離、ダッシュボードの遅延、遅延データの正しさと選択を結び付けています。漏えいアラートの遅延に関するトレードオフは特に明確です。最初の2つのトレードオフは非同期による疎結合の主張が大きく重なっており、推論の幅が限られています。

拡張性・信頼性

85

期待される容量の値はすべて正しく、再接続時の約15,733件/秒や、複製された生データ保持の27.648 TBも含まれています。回答は取り込み容量として32,000件/秒、バースト期間全体分のキュー余力、耐久性のある確認応答、そしてダッシュボードの60分への縮退を明示しています。アップロードリクエストを個別に見積もっておらず、下流の処理速度や再試行・ストレージの余力も定量化していないため、一部の運用上の容量の前提は検証されていないままです。

分かりやすさ

88

回答は簡潔で整理されており、計算と正しさの仕組みが追いやすくなっています。欠測区間のルールとトレードオフの数は特に明確です。ウォーターマークの説明はやや情報密度が高く、アップロードのバッチと個々のレコードをより明確に区別できたはずです。

Gemini 3.8 Flash 8.72

この設計は、プロンプトのすべての要件を、数学的に正確に、アーキテクチャを明確に分離し、堅実なイベント時間処理ロジックで満たしています。定常状態(1,333.3 件/秒、23.04 GB/日、複製後 27.65 TB)とバーストのピーク(15,733 件/秒)の計算は正確です。課金のための重複排除は、(meter_id, interval_start) をキーとしたデータベースレベルの制約に依拠しており、漏水検知のウォーターマークは、48時間のバッファウィンドウ後の欠損インターバルを明示的に扱っています。バーストのサイジングで最高評価に届かなかった唯一の欠落は、バッチ化された HTTP/ネットワークのアップロードリクエストと個々の測定値を区別していない点です。

評価基準ごとの点数

設計の質

88

エンドツーエンドのパイプラインはよく練られています。パーティション分割された取り込みログがゲートウェイとストレージのシンクを分離し、請求の重複排除は (meter_id, interval_start) に対する正規のデータベース一意制約によって厳密に実施され、顧客向けダッシュボードはログのバッファより安全に遅延して更新されます。アラートエンジンは、到着順ではなくイベント時刻に基づいて連続性を評価するために、48時間の完全性ウォーターマークを正しく使用しています。

完全性

86

必須の5つのタスクはすべて800〜1,100語の制限内で扱われています。すべての算術の手順が示され、漏えい検知の欠落区間のロジックは完全に定義されており、選択肢と却下された選択肢を伴うトレードオフが正確に3つ提示されています。ただし、再接続時のバースト中のリクエスト単位の量(例:バッチアップロードリクエストと生の読み取り値の区別)は分析されていません。

トレードオフの説明力

88

トレードオフは正確に3つ提示されており、それぞれで選択された案と却下された代替案が明確に示されています。推論は水道メーターの領域と取り込みの制約に特化しています(例:同期的なファンアウトに対するログのバッファリング、インライン更新に対するマテリアライズドビュー、即時の到着順評価に対するウォーターマークで遅延させたアラート)。

拡張性・信頼性

85

定常状態とバーストピークのすべての計算は、ストームバーストにベースライントラフィックを加算することを含め、期待値と正確に一致しています。キューのバックログバッファと持続スループットの余裕は適切に見積もられています。9点以上の審査基準のもとでは、メーターが24件の読み取り値をバッチ送信する場合に、接続数やリクエスト数を区別せず、読み取り値/秒のみでスループットを見積もっている点がわずかに不足しています。

分かりやすさ

90

記述は率直で構成が整理されており、不要な前置きを避けつつ、すべてのセクションで技術的な正確さを保っています。

3 Claude Opus 5.5

平均(10点満点) 8.39

1. 容量の見積もり

定常レート

  • 1,200,000 メートル ÷ 900 秒/間隔 = 1,333 件の読み取り/秒
  • 1,333 × 200 B ≈ 267 KB/秒

1日あたりの生データ量

  • 1日あたりの読み取り件数: 1,200,000 × 96 間隔 = 115.2 M
  • 1日あたりのバイト数: 115.2 M × 200 B = 23.04 × 10^9 B = 23.04 GB/日

保持期間分の生データストレージ

  • 1コピー: 23.04 GB × 400 日 = 9,216 GB = 9.216 TB
  • 3レプリカ: 9.216 TB × 3 = 27.65 TB

インデックスとコンパクションのオーバーヘッドはこれに加わります。列指向圧縮によって、容量はかなり削減される見込みです。

2. 再接続時のバースト

ピークレート

  • オフラインのメーター: 30% × 1.2 M = 360,...
全文を表示 ▼

1. 容量の見積もり

定常レート

  • 1,200,000 メートル ÷ 900 秒/間隔 = 1,333 件の読み取り/秒
  • 1,333 × 200 B ≈ 267 KB/秒

1日あたりの生データ量

  • 1日あたりの読み取り件数: 1,200,000 × 96 間隔 = 115.2 M
  • 1日あたりのバイト数: 115.2 M × 200 B = 23.04 × 10^9 B = 23.04 GB/日

保持期間分の生データストレージ

  • 1コピー: 23.04 GB × 400 日 = 9,216 GB = 9.216 TB
  • 3レプリカ: 9.216 TB × 3 = 27.65 TB

インデックスとコンパクションのオーバーヘッドはこれに加わります。列指向圧縮によって、容量はかなり削減される見込みです。

2. 再接続時のバースト

ピークレート

  • オフラインのメーター: 30% × 1.2 M = 360,000
  • メーターごとのバッファ済み読み取り: 6 時間 × 4 間隔/時 = 24
  • 未送信データの合計: 360,000 × 24 = 8.64 M 件の読み取り
  • 全メーターが 600 秒以内に均等に分散して再接続: 8.64 M ÷ 600 = 14,400 件の読み取り/秒
  • ライブトラフィックを加算: 14,400 + 1,333 = 15,733 件の読み取り/秒。これは定常時の約 11.8 倍、つまりおよそ 3.15 MB/秒に相当します。
  • 確認応答が遅延した場合、再試行によってこれが 2 倍になる可能性があるため、約 32,000 件の読み取り/秒分を用意します。

設計による吸収の仕組み

  1. ステートレスなゲートウェイ(ロードバランサーの背後にある MQTT/HTTPS)が、メーターの認証情報とペイロードのスキーマを検証します。容量は 32k/秒に加え、N+1 の予備容量で設計します。
  2. 永続ログ(Kafka、レプリケーション係数 3、acks=all、meter_id でパーティション分割)。ゲートウェイは、ログへの書き込みが確認された後にのみ、メーターへ確認応答を送ります。したがって、確認応答された読み取りはすべて永続化され、確認応答されなかった読み取りはメーターによって再試行されます。いずれの場合も、データが失われることはありません。数 MB/秒は Kafka にとって負荷が小さいため、書き込みは高速なままで、確認応答は 30 秒のタイムアウトよりも十分に早く返り、再試行はまれに保たれます。
  3. 2 つのトピック。 ゲートウェイは interval_start が過去 30 分以内の読み取りを live に送り、それより古いものはすべて backfill に送ります。コンシューマーは live を優先して処理するため、嵐の最中でもライブデータに対する 5 分のダッシュボード目標が維持されます。
  4. 下流のコンシューマーがバックログを吸収します。 コンシューマーはピークに追いつく必要はありません。5,000 件の読み取り/秒であれば、8.64 M 件のバックログは約 29 分で処理され、緩和された 60 分のダッシュボード制限内に収まります。Kafka の保持期間は 7 日間なので、コンシューマーが停止しても、データが失われることはありません。
  5. メーター側のジッター。 ファームウェアは、再接続時と再試行時にランダムなバックオフを追加し、バーストをさらに平滑化します。

3. 正確に 1 回だけの課金

課金台帳データベースが、正確に 1 回だけのカウントを保証します。主キー (meter_id, interval_start) を使用します。

  • 課金コンシューマーは INSERT … ON CONFLICT (meter_id, interval_start) DO NOTHING で書き込みます。
  • 再送されたアップロード、ゲートウェイによる再送、クラッシュ後のコンシューマーによる再処理は、いずれも競合に当たるだけで、何も変更されません。
  • Kafka のオフセットは、データベースへの書き込みが成功した後にのみコミットされます。これにより、冪等なシンクへの少なくとも 1 回の配信が実現し、実質的には正確に 1 回と同じ結果になります。
  • 重複が 異なる 値で到着した場合、最初に保存された値が保持され、競合は調整キューに送られます。値が加算されることは決してありません。
  • 課金の合計は、この重複排除されたテーブルからのみ計算されます。
  • ダッシュボードのストア(時系列データベース)も同じキーを upsert で使用するため、そのグラフにも重複はありません。

4. イベント時刻による漏水アラート

meter_id をキーとするステートフルなストリーム処理系(例: Flink)が両方のトピックを読み込み、到着時刻ではなくイベント時刻(interval_start)で動作します。

メーターごとの状態

  • 直近 296 間隔(48 時間 + 24 時間の履歴 + 余裕)にわたるビットマップ。各スロットは 非ゼロ、ゼロ、または 不明 のいずれかです。
  • 現在の連続区間。それぞれ最初の間隔で識別されます。
  • 各連続区間について、すでにアラートを発行したかどうかを記録するフラグ。

ルール

  • 遅延して到着した読み取りは、その位置にかかわらず、対応するスロットを埋めます。到着順序は問題ではなく、重複は何もしません。
  • アラートは、96 個の連続するスロットがすべて存在し、かつすべて 非ゼロ である場合にのみ発行されます。すべてのスロットは確認済みデータで埋められている必要があるため、後から到着したデータによって、すでに発行されたアラートが無効になることはありません。
  • 欠損間隔。 スロットが 48 時間未満(猶予 1 時間を加えた期間)の間は 不明 です。連続区間を延長することも途切れさせることもなく、アラートは単に保留されます。interval_start + 49 h が過ぎると、その読み取りが届くことはあり得ないため、スロットは 欠損、これにより連続区間が途切れる として確定されます。未検証のデータに基づいてアラートが発行されることは決してありません。
  • 連続区間ごとに 1 件のアラート。 アラートレコードは (meter_id, streak_start) をキーとして、一意制約を持つアラートテーブルに保存されるため、再処理されたイベントが 2 件目のアラートを送信することはありません。連続区間は ゼロ の読み取りまたは確定した欠損で終了します。遅延した読み取りが欠損を埋めて 2 つの連続区間を結合した場合、結合された連続区間は最も早い streak_start を保持し、「アラート済み」フラグを引き継ぐため、依然として 1 件のアラートしか発行されません。
  • 状態は永続ストレージにチェックポイントされます。再起動後、処理系はコミット済みのオフセットから再生し、同じ状態を再構築します。

5. トレードオフ

  1. 読み取りに確認応答を返すタイミング

    • 採用: 複製されたログへの書き込み後に確認応答を返す。これにより読み取りが失われないことが保証され、確認応答ごとのコストは数ミリ秒です。
    • 不採用: 受信時にメモリから確認応答を返す。これは高速ですが、ゲートウェイがクラッシュすると、メーターがバッファから既に削除した読み取りが静かに失われます。
  2. 重複の除去方法

    • 採用: 課金台帳の一意キーによる冪等な書き込み。これはシンプルで検証しやすく、どのソースからの再生にも耐えられます。
    • 不採用: エンドツーエンドの Kafka 正確に 1 回トランザクション。これらは、確認応答が失われた後にメーターが再試行するなど、Kafka の前 で発生した重複を検出できません。また、調整コストが増え、運用も困難です。
  3. 漏水検出における欠損間隔の扱い

    • 採用: 確定した欠損は連続区間を途切れさせる。これにより、推測されたデータに基づく誤アラートが発生せず、すべてのアラートを顧客に対して裏付けることができます。代償として、48 時間の接続欠損がある実際の漏水は、発見が遅れる可能性があります。
    • 不採用: 欠損を連続区間の継続とみなす、または隣接する読み取りから補完する。これにより、より多くの漏水を検出できますが、実在しなかった読み取りに基づいてアラートが発行され、「連続区間ごとに 1 件のアラート」というルールも不明確になります。

まとめ

  • 容量: 定常時 1,333 件の読み取り/秒、23.04 GB/日、3 レプリカで 27.65 TB を保存。
  • バースト: ピーク 15,733 件の読み取り/秒。確認済みの書き込み後にのみ確認応答を返す永続ログと、ライブデータの優先処理によって吸収。
  • 課金: 台帳の一意キーによって、正確に 1 回だけのカウントを保証。
  • 漏水アラート: イベント時刻で計算し、未検証のデータに基づいて発行することは決してなく、連続区間ごとに 1 件に制限。
Claude Opus 5.5 8.44

これは、よく整理された優れた設計です。期待される値はすべて正しいです。1,333件/秒の読み取り、1日あたり23.04 GB、生データ9.216 TB、レプリケーション後27.65 TB、さらにバースト時は15,733件/秒(定常時の約11.8倍)です。課金は、(meter_id, interval_start) をキーとする冪等な台帳によって厳密に1回(exactly-once)の処理を実現しており、確認応答(acknowledgement)は永続ログへの書き込み後にのみ行われます。漏水検知はイベント時間で実行され、欠落した区間についても明示的で一貫したルールがあります。システム固有のトレードオフは、ちょうど3つ挙げられています。主な不足点は、バースト対応計画でアップロードのリクエストやバッチと個々の読み取りが区別されていないことで、このため9点以上のスコアは付けられません。また、ゲートウェイの容量も、接続数やリクエスト数ではなく、読み取り件数/秒でしか示されていません。

評価基準ごとの点数

設計の質

85

課金台帳が、(meter_id, interval_start)に対するINSERT ON CONFLICTを用いて適用する構成要素として明記されています。オフセットはDB書き込みの後にのみコミットされ、競合する重複は照合に回されます。漏えい処理部は、メーターごとにイベント時刻の状態を保持し、3状態のスロットを使い、遅れて到着したデータでストリークを統合し、一意の(meter_id, streak_start)によるアラートキーを使用します。ライブとバックフィルのトピック分割は具体的で、数値に裏付けられています。ただし、9点以上の条件であるバースト計画がアップロードリクエストを読み取りと分離することを求める点が満たされていないため、9点以上には届きません。

完全性

85

チェックリストの5項目すべてに対応しています。容量計算、バーストのピークと吸収、実行者を伴う正確に1回の課金、欠損インターバルの明示的ルールを含むイベント時刻の漏えいルール、そしてちょうど3つのトレードオフです。1,033語で、要求された範囲内に収まっています。アップロードリクエストと読み取りを区別していない(例えば約600リクエスト/秒など)ため、9点以上には届きません。

トレードオフの説明力

85

トレードオフはちょうど3つあり、それぞれが選択された案と退けられた案を述べ、このシステムに固有の影響を示しています。対象は、ログ書き込み後の確認応答対メモリからの確認応答、Kafkaトランザクション対冪等なシンク(Kafkaに届く前のリトライはトランザクションを回避するという点を正しく指摘)、そしてストリークを切るギャップ対ギャップ補完です。一般的ではなく具体的ですが、全体としては9点以上の条件を満たしていません。

拡張性・信頼性

82

容量とバーストの計算は正しく、定常負荷も含まれています。リトライ用の余剰容量の確保は妥当な追加です。バックログの排出速度(5,000件/秒で約29分でクリア、60分の制限内)、7日間のKafka保持期間、ダッシュボードの機能縮退がすべて明記されています。確認応答がレプリケーション済みの書き込みの後に行われるため、損失がないという論理もしっかりしています。ただし、アップロードリクエストやバッチが読み取りと区別されておらず、ゲートウェイのサイジングでは接続数やリクエスト数が省略されています。

分かりやすさ

85

番号付きのセクションが要件に直接対応しており、計算は段階的に示され、ルールは明確です。要約は簡潔です。圧縮に関する曖昧な表現や、296スロットのビットマップを選んだ理由がやや説明不足である点など、細かな粗い部分があります。

GPT-6.1 Sol 7.76

この回答は、正確な容量計算、信頼できる永続的な取り込み経路、そして厳密に定義された冪等な課金を、語数制限内で示しています。主な弱点は漏水アラートの正確性です。以前にアラート済みのランを統合すると、1連続区間につき1件のアラートというルールに違反する可能性があります。また、メーターのバッファが期限切れになったとしても、取り込みパイプラインから読み取り値がもう届かないことの証明にはなりません。バースト時の容量見積もりはおおむね妥当ですが、キュー容量とアップロードリクエストのレートは定量化されておらず、バックログの解消に関する計算では、同時に行われるライブ処理が考慮されていません。

評価基準ごとの点数

設計の質

65

レプリケーションログの確認応答境界と課金台帳の主キーは、耐久性のある取り込みと正確に1回の課金効果を適切に支えています。イベント時刻のスロットと明示的な欠測区間ルールは適切な基盤です。しかし、2つの実行がそれぞれ警報を出した後に、遅れて届いた欠損補完の読み取り値がそれらを1つのストリークに統合する可能性があります。アラート済みフラグを引き継いでも、既に送信された2件の通知を取り消すことはできません。また、49時間後に読み取り値が不可能になると宣言することは、メーター側の上書きと下流での配信遅延を混同しています。既にKafkaにアップロードされた読み取り値も、後になってプロセッサに届く可能性があります。これらは必須のリークのセマンティクスにおける重大な欠陥です。

完全性

85

要求された5つの領域はすべて明示的に扱われており、レプリケーションの計算、バーストの計算、名指しされた課金強制コンポーネント、欠測区間ルール、そして選択されたトレードオフと却下されたトレードオフが正確に3つ含まれています。測定された1,033語は長さの要件を満たしています。ただし、アップロード要求のサイジングと、キューおよびバックログの明示的な容量見積もりが欠けているため、追加の未達成条件は満たされていません。

トレードオフの説明力

86

3つのトレードオフが示されており、それぞれに明確な選択肢と却下された選択肢があります。確認応答境界とメーター生成の重複の扱いは、このシステムに特に関連しています。欠測データのトレードオフも具体的ですが、上書きされた読み取り値は決して利用可能にならない可能性があるという点を、単に検出が遅れるだけとして過小評価しています。

拡張性・信頼性

76

定常レート、1日あたりのボリューム、レプリケーションされた保存容量、15,733件/秒のバーストピークはいずれも正しいです。再試行、耐久的な確認応答、リアルタイムとバックフィルの優先制御のための余裕見積もりは有益です。しかし、7日間の保持期間は明示的なキュー容量の見積もりになっておらず、要求スループットと読み取りスループットが区別されていません。5,000件/秒を下流の総容量とみなす場合、同時のリアルタイムトラフィックを差し引くとバックフィルに使えるのは約3,667件/秒となり、保守的な消化時間は29分ではなく約39分になります。それでも緩和されたダッシュボードの目標には収まります。

分かりやすさ

87

番号付きの構成は課題にそって明確に進み、計算は検証しやすく、課金と警報のルールは具体的に示されています。回答は要求された語数の範囲内に収まっています。ただし、「何も失われない」や、49時間後に読み取り値が「決して届かない」といった断定的な主張は、明示すべき前提を隠しています。また、5,000件/秒の消費者容量の対象範囲も曖昧です。

Gemini 3.8 Flash 8.98

この設計は、機能要件と非機能要件のすべてを網羅的に満たしており、計算結果も期待値と完全に一致しています。取り込みパイプライン、課金のための重複排除の仕組み、そして欠測区間のルールを明示したイベント時刻ベースの漏水検知は、いずれもよく設計されています。ただし、バースト時の規模見積もりでは、スループットを1秒あたりの測定値数のみで分析しており、アップロード時のネットワークリクエスト(バッチ処理)と個々の測定値との区別が抜けています。そのため、ポリシーに従い、スケーラビリティのスコアは9.0の基準を下回ったままとなります。

評価基準ごとの点数

設計の質

88

アーキテクチャは堅牢であり、ステートレスなゲートウェイ、ライブ用とバックフィル用のトピックに分割されたレプリケーション済みKafkaログ、そして冪等な課金シンクを活用しています。漏えい検知の設計は、遅延到着および順序が入れ替わって到着したデータに対する明示的な状態処理を伴い、イベント時刻で正しく動作しています。

完全性

92

プロンプトのすべての要件を満たしています。定常状態とバースト状態の計算が完全であり、正確に1回の課金のコンポーネントとロジック、漏えいアラートに対する明示的な欠測ルール、システム固有のトレードオフがちょうど3つ、そして語数制限への準拠が含まれています。

トレードオフの説明力

92

ちょうど3つの、非常に関連性が高くドメインに特化したトレードオフが示されています(確認応答のタイミング、重複排除の場所、漏えい検知における欠測区間の解釈)。それぞれ、採用したアプローチと却下した代替案を明確に対比しています。

拡張性・信頼性

87

容量およびピークの計算は数学的に正確です(バースト時の定常トラフィックの加算を含む)。バックログの解消とダッシュボードのSLA低下も適切に扱われています。ただし、分析はHTTP/MQTTのアップロードリクエスト(例:毎秒600バッチ)と個々の読み取りを区別していないため、この基準は9.0未満に抑えられています。

分かりやすさ

92

応答は構成が明確で簡潔にまとまっており、見出しが整理され、導出過程も分かりやすく、読みやすい内容です。

4 Claude Sonnet 5.5

平均(10点満点) 8.20

1. 容量の見積もり

定常状態

  • 1日あたりの計測間隔数: 24 h × 4 = 96。
  • 1秒あたりの計測値数: 1,200,000 / 900 s = ≈1,333 件/s。ネットワーク上では約 267 KB/s になります。
  • 1日あたりの計測値数: 1,200,000 × 96 = 115.2 M。
  • 1日あたりの生データ量: 115.2 M × 200 B = 23.04 GB、つまり ≈23 GB/日。
  • 保持: 23.04 GB × 400 日 = 9,216 GB ≈ 1コピーあたり 9.2 TB。
  • 3レプリカの場合: 9.216 TB × 3 = ≈27.6 TB(27,648 GB)。
  • これにはインデックスと圧縮が含まれていません。約30%の余裕を加えると、確保すべき容量は約36 TBになります。

2. 再接続時のバースト

  • 影響を受けるメーター: 30% × 1.2 M = 360,000。
  • メーター...
全文を表示 ▼

1. 容量の見積もり

定常状態

  • 1日あたりの計測間隔数: 24 h × 4 = 96。
  • 1秒あたりの計測値数: 1,200,000 / 900 s = ≈1,333 件/s。ネットワーク上では約 267 KB/s になります。
  • 1日あたりの計測値数: 1,200,000 × 96 = 115.2 M。
  • 1日あたりの生データ量: 115.2 M × 200 B = 23.04 GB、つまり ≈23 GB/日。
  • 保持: 23.04 GB × 400 日 = 9,216 GB ≈ 1コピーあたり 9.2 TB。
  • 3レプリカの場合: 9.216 TB × 3 = ≈27.6 TB(27,648 GB)。
  • これにはインデックスと圧縮が含まれていません。約30%の余裕を加えると、確保すべき容量は約36 TBになります。

2. 再接続時のバースト

  • 影響を受けるメーター: 30% × 1.2 M = 360,000。
  • メーターごとのバッファ済み計測間隔数: 6 h × 4 = 24。
  • バックログ: 360,000 × 24 = 8.64 M 件の計測値、つまり 1.73 GB。
  • アップロード時間枠: 10 分 = 600 s、均等に分散されるとして、バックログのレートは 8.64 M / 600 = 14,400/s。
  • リアルタイムのトラフィックは 1,333/s で継続します。
  • ピーク = 14,400 + 1,333 ≈ 15,733 件/s。定常状態の約11.8倍、または約3.1 MB/s です。

再送がこれに加わります。確認応答が30秒を超えて遅れると、メーターは再送します。そのため、取り込み経路は ピークの2倍、約32,000/s を基準に設計します。実際には、1ノードあたり約5,000/s の、ステートレスな取り込みノードを8台用意し、N+2 の予備を備えます。

データを失わない仕組み

  1. 取り込みゲートウェイは計測値を検証し、Kafka などの永続化されたパーティション分割ログに追記します。acks=all、レプリケーション係数 3、min.insync.replicas=2 を使用します。追記が成功した後にのみ、メーターへ確認応答を送ります。
  2. ログは meter_id をキーとする 48 パーティションを持ち、7日分のデータを保持します。バーストは約 3 MB/s であり、ログにとっては問題になりません。コンシューマは、データを失うことなく数分から数時間遅れても構いません。
  3. ゲートウェイまたはログが過負荷になった場合、503 または確認応答なしを返します。メーターは計測値を保持して再試行します。その 48 時間のバッファは、6時間の停止と復旧をカバーし、約42時間の余裕が残ります。したがって、バックプレッシャーによってデータが失われることはありません。
  4. 下流のコンシューマ(課金ライター、ダッシュボードのプロジェクタ、漏水プロセッサ)は、それぞれ別のコンシューマグループを持ちます。書き込みが成功した後にのみオフセットをコミットするため、クラッシュしても損失ではなく再生が発生します。
  5. コンシューマは約 30,000/s を処理できるよう設計します。そうすると、8.64 M 件のバックログは約5分で解消され、60分の緩和されたダッシュボードの予算内に十分収まります。通常運転時には遅延は秒単位にとどまり、計測値の 99% で5分の目標を満たします。

3. 正確に1回の課金

配信は、メーターの再試行、ゲートウェイの再試行、ログの再生のすべての段階で、少なくとも1回です。正確に1回の効果は、1つのコンポーネントによって保証されます。それが 計測値ストア で、meter_id によってシャーディングされたレプリケーション済みの SQL ストア(3レプリカ)です。このストアは 主キー (meter_id, interval_start) を持ちます。

  • 課金ライターは INSERT … ON CONFLICT DO NOTHING を実行します。重複は何もしない操作となり、それがメーターの再試行、再生、コンシューマの再起動のいずれから来たものであっても同じです。
  • 課金合計は、このテーブルへの問い合わせによって計算されます。二重にインクリメントされうるストリームのカウンターとして保持されることは決してありません。
  • interval_start はメーターが設定し、15分グリッドに揃えられます。ゲートウェイは位置がずれた値を拒否し、隔離します。
  • 同じキーに異なるペイロードの重複が届いた場合、最初の書き込みが優先されます。その競合はレビュー用の不一致テーブルに書き込まれるため、課金が黙って変更されることはありません。
  • 下流のコンシューマは、挿入によって新規作成されたと報告された行に対してのみ動作します。したがって、ダッシュボードと漏水プロセッサも重複排除されます。

このストアは生データのストアでもあります。その 27.6 TB は、上で計算したレプリケーション後の数値です。

4. 遅延データおよび順序が前後したデータの下での漏水アラート

ルールは interval_start によって判定されるため、プロセッサは イベント時刻を使用し、到着時刻に基づくウィンドウを一切持ちません。これは meter_id をキーとするステートフルなストリームジョブで、新規に挿入された計測値のみを消費します。

メーターごとの状態(約70バイト):

  • 直近288間隔(72時間)を覆う、間隔ごとに2ビットのリング。3つの値は 不明、ゼロ、非ゼロ です。
  • 直近にアラートを出した連続期間の alerted_range = [start, end]。

計測値を受け取るたび、間隔 t について:

  1. t のスロットを設定します。
  2. それが非ゼロであれば、t から左右に走査し、t を含む 非ゼロ 間隔の最大連続区間を求めます。
  3. 区間の長さが 96 以上で、かつ alerted_range と重ならない場合、アラートを1件発行します。その後、alerted_range を当該区間に設定します。
  4. 区間が alerted_range と重なる場合、alerted_range を拡張し、何も発行しません。

状態は計測値の集合のみに依存し、その順序には依存しないため、逆順で到着したバッチも、順序どおりに到着した場合と同じ結果になります。隙間を埋める遅延計測値によって、2つの短い区間が結合されて96長の区間になることがあり、その時点でアラートが発火します。ゼロの計測値は連続期間を終了させます。次に該当する区間は新しい連続期間であり、再度アラートを出すことがあります。

アラートは alerted_range と同一トランザクションでアウトボックスに書き込まれ、一意キー (meter_id, streak_start) がこれを補強します。したがって、再生や再起動によって2件目のアラートが送られることはありません。

欠損間隔。 欠損間隔は 不明です。ゼロでも非ゼロでもなく、補間されることも決してありません。 それは連続性を断ち切るため、隙間をまたいでアラートが発生することはありません。欠損した計測値が後から到着した場合、その連続期間は自動的に再評価されます。これは間隔から最大48時間後に起こりえます。48時間が経過すると、その間隔は永久に失われ、連続期間は途切れたままになります。これは誤報を避ける方針であり、長期停止の後にアラートが遅延するか、見逃される可能性があるというコストを伴います。見逃しアラートの方が誤報よりも悪いと判明した場合、別個の「データ欠損」通知を追加できます。

72時間より古い状態は退避されます。48時間の上限より古い計測値は、正当には到着しえないため、記録のうえ無視されます。

5. トレードオフ

1. メーターへいつ確認応答するか。

  • 採用: 永続ログへの追記後に確認応答する。
  • 却下: SQL ストアへの書き込み後に確認応答する。
  • 理由: ログへの書き込みは高速な追記であり、データベースの負荷の影響を受けません。したがってバーストによって確認応答の遅延が 30 秒を超えて伸び、再試行の嵐を引き起こすことがありません。
  • コスト: 確認応答の時点では、データはまだ照会できません。課金は遅延を許容し、バースト時にはダッシュボードが 60 分を許容するため、これは受け入れられます。

2. どこで重複排除するか。

  • 採用: 冪等な挿入を伴うデータベースの主キー制約。
  • 却下: ストリーム段階での重複排除、すなわち Kafka トランザクション、またはインメモリもしくは Bloom フィルタによる「既読」キャッシュ。
  • 理由: Kafka トランザクションが扱うのはログ区間のみで、新しいメッセージを生成するメーターの再試行は対象外です。キャッシュは容量に上限があり、再起動時に失われることがあります。Bloom フィルタには偽陽性があるため、課金対象の計測値を捨ててしまうおそれがあります。
  • コスト: 重複のたびに、低コストな競合挿入が1回発生します。ピークの2倍の負荷でも、ストアの容量には十分余裕があります。

3. 漏水をどのように評価するか。

  • 採用: 新しい計測値のたびに評価する、イベント駆動のメーターごとのビットマップ。
  • 却下: 定期的なバッチスキャン、またはウォーターマークで閉じるウィンドウ。
  • 理由: ビットマップは順序に依存せず、ウォーターマークによる遅延なしに48時間の遅延に耐えられるため、最後の欠損間隔が到着した時点でアラートが発火します。ウィンドウでは48時間のウォーターマークが必要になり、すべてのアラートが遅延するか、後で修正が必要な誤った結果を出すことになります。
  • コスト: 約 85 MB のキー付き状態(1.2 M × 約 70 B)と、チェックポイントからの慎重な状態復旧が必要になります。
Claude Opus 5.5 8.36

強力で、数値も正確な設計です。想定される容量とバースト値はいずれも正しく、計算過程も示されています。正確に1回だけの課金は、読み取りストアでの主キーによる冪等な挿入によって担保されており、確認応答は永続的なログへの追記が完了した後にのみ行われます。イベント時刻に基づく漏水検知のロジックは到着順に依存せず、欠損区間に関するルールも明示されています。3つのトレードオフはいずれもこのシステム固有のもので、それぞれ採用した案と却下した案が示されています。弱点は、アップロードリクエストと読み取りデータが一切区別されていないこと(リクエストレートの数値がないこと)で、そのため、どの評価基準でも9点以上は付けられません。また、回答は1,161語で、1,100語の上限も超えています。

評価基準ごとの点数

設計の質

85

コンポーネントは具体的で番号付けされています。acks=all、RF3、min.insync=2、48パーティション、7日間の保持期間を持つKafka、(meter_id, interval_start)をキーとし、ON CONFLICT DO NOTHINGを使うシャーディングされたSQLストア、2ビットのリングと一意なストリークキーを持つアウトボックスを備えたステートフルな漏えい処理機構があります。二重課金を強制するコンポーネントも明確に示されています。競合するペイロードの扱いと「新規挿入されたもののみ」のファンアウトは、よく考えられています。9点以上の条件はすべては満たされていないため、スコアは9点未満にとどまります。

完全性

85

チェックリストの5項目すべてが十分に扱われています。キャパシティの計算、バーストのピーク、二重課金防止とそれを強制するコンポーネント、明示的な欠損区間ルールを含むイベント時刻に基づく漏えいルール、そして正確に3つのトレードオフがすべて含まれています。語数は1,100語を超えていますが1,210語未満であるため、ポリシーの完全性に関する減点は適用されません。要求と読み取りの区別がないため、9点以上にはなりません。

トレードオフの説明力

85

トレードオフは正確に3つあり、いずれもこのシステム固有のものです。ログ後の確認応答とDB後の確認応答の比較、DBキーによる重複排除とストリームやBloomフィルタによる重複排除の比較、イベント駆動のビットマップとウォーターマークウィンドウの比較です。それぞれ採用案と却下案を挙げ、そのコストを述べています。Kafkaのトランザクションがメーターの再試行を対象としていないという指摘を含め、推論は妥当です。全体的な9点以上の条件により、9点未満に抑えられています。

拡張性・信頼性

83

数値は正しく、1,333件/秒、23.04 GB/日、9.216 TB、27.6 TBです。バーストは860万件の読み取り、14,400 + 1,333 = 15,733件/秒で、定常状態の約11.8倍です。回答には2倍の再試行ヘッドルーム、ノードのサイジング、7日間のログ保持期間に対する1.73 GBのバックログ、約5分の排出時間、ダッシュボードの遅延目標、そして48時間のバッファ内での確認応答なし再試行によるバックプレッシャーが含まれています。アップロード要求のレート(例:約600バッチ/秒)を読み取りとは別に計算しておらず、9点以上の資格はありません。

分かりやすさ

75

番号付きのセクション、箇条書き、太字の主要数値により整理されており、理解しやすい内容です。長さは1,161語で、800~1,100語の制限を超えています。この超過はポリシーで明示的に定められていないため、ここで減点します(-1)。

GPT-6.1 Sol 7.19

この回答は、容量とバーストの計算が正しく、永続的な取り込み経路が具体的で、請求の重複排除がデータベースで強制され、システム固有のトレードオフがちょうど3つ示されています。ただし、リーク検知アルゴリズムには問題があります。遅延して届いた測定値があとから連続区間に加わると、その連続区間に対して複数のアラートが出る可能性があります。また、挿入に成功した後に下流のプロセッサへ引き渡す処理は、説明されている内容ではクラッシュに対して安全ではありません。さらに、回答は指定された語数の上限を超えており、アップロードリクエストのサイズ見積もりも省かれています。

評価基準ごとの点数

設計の質

55

耐久ログと主キー制約は、請求の効果を厳密に一度だけ適用するための確かな基盤となっています。ただし、リークの正しさは保証されていません。未知の間隔で区切られた2つの条件を満たす実行それぞれがアラートを発行しうる一方、その間隔に非ゼロの値が到着すると、両者が1つのストリークになります。また、順序が入れ替わって到着した非連続の実行がある場合、最後にアラートを出した範囲だけを保持すると、重複排除の履歴が失われます。さらに、新しく挿入された行のみを消費するには、トランザクショナルアウトボックスまたはCDCによる引き渡しが必要です。そうでなければ、挿入後かつ下流への公開前にクラッシュが起きた場合、再生によって重複した無操作が生じ、ダッシュボードやリーク処理が飛ばされるおそれがあります。アラートアウトボックスはローカル状態の永続化には対応していますが、これらの問題は解決していません。

完全性

80

要求された5つのトピックすべてが明示的に扱われており、保持期間とレプリケーション、バーストピーク時のライブトラフィック、請求の強制コンポーネント、欠損間隔のルール、そして採用と不採用を比較した正確に3つのトレードオフが含まれています。測定された語数は1,161語で、上限の1,100語を超えており、この点で1点減点されます。また、アップロードリクエストとリーディングが区別されておらず、キューやバックログのストレージ容量の数値的な見積もりも示されていないため、満点にはなりません。

トレードオフの説明力

80

採用と不採用の選択肢、それぞれの関連するコストを明示した、正確に3つのトレードオフが示されています。確認応答の配置と耐久性のある重複排除が、リトライストームと請求の安全性にうまく結び付けられている点は特に優れています。一方で、ウォーターマークに基づくすべてのアラートを48時間遅らせることが必要だとする点は、その必要性を過大に述べています。また、順序に依存せず即時に正しいとする主張は、ストリークの結合問題によって損なわれています。

拡張性・信頼性

75

必要な計算はすべて正しく示されています。約1,333件のリーディング/秒、23.04 GB/日、レプリケーション後の27.648 TBの保持量、再接続時の15,733件のリーディング/秒です。取り込みとコンシューマのスループット、リトライの余裕、レプリケーションされたログ、7日間の保持期間、そしてダッシュボードの縮退と復旧についても記述されています。ただし、キューの容量がバイトやレコード数で定量化されておらず、アップロードリクエストのスループットも省略されています。さらに、固定の2倍のリトライ余裕は、持続的なリトライ増幅に対する防御を自ら保証するものではありません。また、メーターが持つ48時間の有限バッファを考えると、バックプレッシャーがデータを決して失わないという主張は絶対的すぎます。

分かりやすさ

84

番号付きのセクション、目に見える計算、そして明示的な「採用/不採用」のラベルにより、設計が検証しやすくなっています。少なくとも1回配送と一度だけの効果の区別は、全体として適切に用いられています。一方で、リークの結果が順序に依存しないこと、またバックプレッシャーがデータを決して落とさないことといった主張は、その根拠となる仕組みに比べて強すぎます。さらに、別々のログ・コンシューマグループと、新しく挿入された行のみの消費との関係も不明確です。

Gemini 3.8 Flash 9.04

この回答は非常によく構成されており、正確で、プロンプトのすべての要件に厳密に対応しています。容量の見積もりと再接続時のバースト計算は、想定されている正確な数値と一致しています。重複排除の仕組みと漏水検知のステートマシンは、イベント時刻のセマンティクスを軸に丁寧に設計されており、3つのトレードオフも具体的で、このシナリオに合わせたものになっています。スケーラビリティが最上位の評価帯にわずかに届かなかったのは、バースト時にアップロードのHTTP/ネットワークリクエストを個々の測定値と区別していなかったという点だけが理由です。

評価基準ごとの点数

設計の質

92

アーキテクチャは関心事を明確に分離しています。取り込みログがバックプレッシャーへの耐性を提供し、リレーショナルストアが(meter_id, interval_start)による冪等な重複排除を強制し、インメモリのイベント時刻状態機械が到着順に依存せずにリーク連続区間を評価します。

完全性

88

必要な5つのセクションすべてが、計算、バースト吸収、厳密に一度だけの処理セマンティクス、明示的な欠損区間ルールを含むリーク評価、そしてシステム固有の3つのトレードオフを含めて、十分に回答されています。目標の1,100語をわずかに超えていますが(1,161語)、1,210語のペナルティ閾値を十分に下回っています。

トレードオフの説明力

93

トレードオフはちょうど3つで、それぞれ選択された具体的な案と却下された案を挙げています(ACKのタイミング、重複排除の場所、リーク評価の方式)。一般的な比較にとどまらず、現実的な根拠と明確なトレードオフのコストが示されています。

拡張性・信頼性

87

容量の計算とバースト計算は完全に正確です(定常時1,333計測値/秒、バースト時のピーク15,733計測値/秒)。耐久性のあるキューによるバッファリングとバースト時のダッシュボードの縮退も、よく扱われています。ただし、アップロードリクエスト(例:約600リクエスト/秒で、1回のバッチに24件の計測値をアップロードするメーター)と、生の計測値/秒を区別していないため、9点以上の条件を満たしていません。

分かりやすさ

92

文章は簡潔で、明確にセクション分けされており、理解しやすくなっています。数式、システム状態の詳細、連続区間評価のアルゴリズム手順は、非常に明快に説明されています。

5 Gemini 3.8 Flash

平均(10点満点) 7.90

地域スマート水道メーター取り込みアーキテクチャ

1. 容量見積もりと計算

定常状態の毎秒読み取り数
  • メーター群: $1,200,000$ 台のメーター。
  • 間隔: 15分ごと($15 \times 60 = 900$ 秒)。
  • 計算:
    $$\text{定常スループット} = \frac{1,200,000\text{ 読み取り}}{900\text{ 秒}} = 1,333.33\text{ 読み取り/秒}$$
1日あたりの生データ量
  • メーター1台あたりの1日の読み取り数: $\frac{24\text{ 時間} \times 60\text{ 分}}{15\text{ 分}} = 96\text{ 読み取り/日}$。
  • 1日の合計読み取り数: $1,200,000 \times 96 = 115,200,000\text{ 読み取り/日}$。
  • ペイロードサイズ: 通信上 $200\text{ バイト/読み取り}$。...
全文を表示 ▼

地域スマート水道メーター取り込みアーキテクチャ

1. 容量見積もりと計算

定常状態の毎秒読み取り数
  • メーター群: $1,200,000$ 台のメーター。
  • 間隔: 15分ごと($15 \times 60 = 900$ 秒)。
  • 計算:
    $$\text{定常スループット} = \frac{1,200,000\text{ 読み取り}}{900\text{ 秒}} = 1,333.33\text{ 読み取り/秒}$$
1日あたりの生データ量
  • メーター1台あたりの1日の読み取り数: $\frac{24\text{ 時間} \times 60\text{ 分}}{15\text{ 分}} = 96\text{ 読み取り/日}$。
  • 1日の合計読み取り数: $1,200,000 \times 96 = 115,200,000\text{ 読み取り/日}$。
  • ペイロードサイズ: 通信上 $200\text{ バイト/読み取り}$。
  • 計算($1\text{ GB} = 10^9\text{ バイト}$ の10進単位を使用):
    $$\text{1日の取り込み量} = 115,200,000 \times 200\text{ バイト} = 23,040,000,000\text{ バイト} = 23.04\text{ GB/日}$$
400日保持のための生ストレージ(3レプリカ)
  • 1コピーの400日分ストレージ:
    $$400\text{ 日} \times 23.04\text{ GB/日} = 9,216\text{ GB} = 9.216\text{ TB}$$
  • 3重レプリケーション時のストレージ:
    $$9,216\text{ GB} \times 3 = 27,648\text{ GB} = 27.648\text{ TB}$$

2. 再接続バーストのサイジングと吸収

バーストピークの計算
  • 影響を受けるメーター: $30% \text{ of } 1,200,000 = 360,000\text{ 台}$。
  • 停電時間: 6時間 = メーター1台あたり累積 $6 \times 4 = 24\text{ 間隔}$。
  • バッファされた読み取りの合計: $360,000 \times 24 = 8,640,000\text{ 読み取り}$。
  • 再接続ウィンドウ: 10分 = $600\text{ 秒}$(均一に分散)。
  • バックログからのバースト到着率:
    $$\text{バースト率} = \frac{8,640,000\text{ 読み取り}}{600\text{ 秒}} = 14,400\text{ 読み取り/秒}$$
  • 同時に発生するライブの定常トラフィック: $1,333.33\text{ 読み取り/秒}$。
  • 合計ピークスループット:
    $$\text{ピーク率} = 14,400 + 1,333.33 = 15,733.33\text{ 読み取り/秒} \approx 15,734\text{ 読み取り/秒}$$
  • ピーク取り込み帯域幅:
    $$15,734\text{ 読み取り/秒} \times 200\text{ バイト} = 3,146,800\text{ バイト/秒} \approx 3.15\text{ MB/秒 (25.2 Mbps)}$$
吸収戦略
  1. エッジでの終端と高速ACK: 水平スケールするステートレスなAPIゲートウェイ群が取り込みエンドポイントの前段に配置されます。メーターはACKを30秒受け取れないと再試行するため、ゲートウェイはバッチ構造を検証し、ペイロードを分散コミットログ(Apache Kafka)に直ちに追加してから、50ミリ秒未満でHTTP 202/200を返します。これにより、未確認のクライアントタイムアウトと連鎖的な再試行を排除します。
  2. キューによる疎結合化: Kafkaは永続的な衝撃吸収材として機能します。パーティションは meter_id のハッシュで厳密に分割されます(最大 $50,000\text{ メッセージ/秒}$ を余裕をもって処理するため64パーティションを使用)。バースト中に下流のコンシューマ処理が遅くなっても、取り込み経路はエッジゲートウェイに背圧をかけることなく、3.15 MB/秒のデータストリームを直接ディスクに永続化します。
  3. ダッシュボード・コンシューマのスロットリング: 顧客ダッシュボードの投影ワーカーは取り込みの消費を絞り込み、緩和された60分のバーストSLOを容易に満たしつつ、重要な請求およびアラートのストリーム処理装置に専用の消費能力を確保します。

3. 厳密に一度だけの請求取り込み

ネットワーク再試行は必然的に、同一の (meter_id, interval_start) を持つ重複メッセージを生成します。本設計では、冪等なアップサートとリレーショナルの主キー制約の組み合わせにより、**請求ストレージ読み込み層(請求取り込みパイプライン)**で厳密に一度だけのカウントを強制します。

メカニズム
  • 自然キー: 請求ステージング台帳の主キーは (meter_id, interval_start) です。
  • 重複排除の境界: トランザクション型のバッチローダーがKafkaからイベントを取得し、決定的なアップサート意味論(INSERT ... ON CONFLICT (meter_id, interval_start) DO NOTHING)を用いて、追記専用の不変な請求台帳データベースに書き込みます。
  • 二段階の冪等性:
    1. ステージングの前に、ステートフルなストリームプロセッサ(例: Apache Flink)が、RocksDBに裏打ちされた状態テーブルを使用し、スライディングする48時間の重複排除フィルタ(メーターの最大48時間のバッファに一致)を保持します。このウィンドウ内で発生した重複するネットワーク再試行は直ちに破棄されます。
    2. フィルタを迂回する再試行、またはワーカーの再起動後に再読み込みされる再試行は、(meter_id, interval_start) のデータベース一意インデックス制約に当たります。請求集計クエリはこの重複排除済みの台帳のみを合計するため、過剰計上は数学的に不可能です。

4. 順序外れ・欠損読み取りを伴う漏水アラートエンジン

検知ロジック

連続した漏水は、15分間隔が96回連続(24時間連続)で非ゼロの流量と定義され、interval_start によって厳密に判定されます。

ストリーム処理パイプライン
  1. ウォーターマークと許容遅延: ストリーミングトポロジー(Apache Flink)は、メーターごとのキー付き状態を保持し、連続する間隔を追跡します。メーターは最大48時間までバッファできるため、ストリームジョブは48時間の許容遅延しきい値を設定します。遅れて到着した読み取りは破棄されず、キー付きのメーター状態へ再度振り分けられます。
  2. 連続性ビットセット / 範囲木: 各メーターは、interval_start で並べられた最新の評価済み間隔を含む間隔状態構造を維持します。順序外れのバーストが到着すると、各間隔は時系列上の対応するスロットを埋めます。
  3. 欠損間隔の扱い:
    • 間隔がパケット損失、クロックのずれ、または48時間のメーターバッファ上書き上限の超過により欠損した場合、それは不明/途切れた連続フローとして扱われます。
    • 仕様では確認済みの非ゼロ流量が 連続 96間隔であることが求められるため、欠損間隔は有効な連続記録をゼロにリセットします。エンジンは欠損データについて、流量があるともゼロ流量であるとも決して仮定しません。
  4. 単一アラートの保証:
    • ステートマシンは streak_count と、ブール値のフラグ alert_emitted_for_current_streak を追跡します。
    • streak_count が96に達すると、エンジンは alert_emitted_for_current_streak が false かどうかを評価します。false の場合、漏水アラートを発行し、フラグを true に設定します。
    • その後の連続した非ゼロ間隔は streak_count を増加させますが、新たなアラートは抑制されます。ゼロの読み取り(または欠損間隔)によって連続が途切れた場合にのみ、streak_count がクリアされ、alert_emitted_for_current_streak が false にリセットされます。

5. アーキテクチャ上のトレードオフ

トレードオフ1: 取り込みの確認応答のタイミング
  • 選択した方式: 生の読み取り値が分散メッセージキュー(Kafka)にコミットされた時点で、受信を確認応答します。
  • 却下した方式: 長期の履歴データベースおよび請求テーブルへの書き込みがコミットされた後にのみ、受信を確認応答します。
  • 根拠: 15,734 rpsの再接続ストームの最中に、エンドツーエンドの完全なACKを待つと、データベースのI/Oボトルネックに達するおそれがあります。応答がメーターの30秒タイムアウトを超えると、メーターは再試行し、取り込み負荷が指数関数的に増大します。キューレベルのACKは、ミリ秒単位での永続化を保証し、再試行を直ちに抑え込みます。
トレードオフ2: 漏水検知の計算アーキテクチャ
  • 選択した方式: ステートフルなイベント時刻ストリーミング処理装置(RocksDB状態バックエンドを用いたApache Flink)。
  • 却下した方式: 分析データベースのテーブルに対する定期的なバッチSQLクエリ(例: 15分ごとに実行)。
  • 根拠: 順序外れの遅延到着を伴う数百万台のメーターに対するバッチSQLスキャンでは、ギャップと連続記録を再構築するために、数十億行にわたる数日分のスライディングウィンドウを照会する必要があります。ステートフルなストリームエンジンは到着時に逐次的にスライディング状態を評価するため、遅延を最小限に抑え、テーブルの反復スキャンを不要にします。
トレードオフ3: 顧客ダッシュボードのデータストレージ
  • 選択した方式: 事前集計された読み取り最適化の時系列/NoSQLストア(例: Apache Cassandra / ScyllaDB)。
  • 却下した方式: 正規化された請求リレーショナルデータベースに対するオンデマンドのクエリ。
  • 根拠: ダッシュボードのクエリは高い読み取り同時実行性と緩やかな一貫性要件(バースト時には最大60分の遅延を許容)を示します。ダッシュボードの読み取りを請求ストアから切り離すことで、顧客のクエリの急増から金融取引を保護し、1日23GB以上での水平スケーリングをサポートします。
Claude Opus 5.5 7.56

容量とバーストの計算は完全に正しく、課金の重複排除は具体的かつ適切な位置に配置されており、システム固有のトレードオフもちょうど3つ挙げられています。弱点は、リークアラートのロジック、バースト対応計画、そして9点以上の条件です。リークのロジックは、欠落があるとストリークをリセットする一方で、48時間の遅延補完も許容しているため、到着順序による影響や重複アラートが発生するおそれがあります。バースト対応計画では、アップロードリクエスト数とバックログのサイズ見積もりが省かれているため、9点以上の条件を満たしていません。

評価基準ごとの点数

設計の質

68

請求の exactly-once 処理は十分に定義されています。請求台帳では (meter_id, interval_start) をキーとする ON CONFLICT DO NOTHING のアップサートを使用し、さらに48時間の Flink 重複排除フィルターを設けています。ACK は Kafka への永続書き込みが完了した後にのみ送信されます。リーク検知の設計では、interval_start をキーとするメーターごとの状態を持ち、48時間の許容遅延を設定しています。ただし、欠損区間があると実行中の streak_count がすぐにリセットされる仕組みに依存しています。これは、欠損を「不明」と呼ぶことや遅延補完と矛盾します。また、後から欠損が埋まった場合にストリークをどのように再計算するかが示されていません。後から埋まった欠損でアラートフラグをリセットすると、重複アラートが発生するおそれもあります。

完全性

80

必要とされる5つの項目はすべて扱われており、明示的な欠損区間のルールとすべての容量数値も含まれています。全体は984語で、制限内に収まっています。ただし、一部の詳細が不足しています。リクエスト単位の見積もりやバックログ量の記述がありません。

トレードオフの説明力

80

トレードオフはちょうど3つあり、それぞれが選択した案と却下した案を明示しています。いずれもこのシステムに結び付いています。ACK のタイミングと30秒の再試行、遅延データを扱う場合のストリーミング型とバッチ型のリーク検知、そして独立したダッシュボード用ストアです。3つ目は、その根拠がやや一般的です。

拡張性・信頼性

76

期待される数値はすべて正しいです。1,333/秒、23.04 GB/日、9.216 TB と 27.648 TB、そしてバーストは 14,400 + 1,333 = 15,733/秒です。Kafka によるバッファリング、高速な ACK、パーティションサイズ設計、60分 SLO に合わせたダッシュボードのスロットリングも記載されています。一方で、読み取り値のレートとは別に、アップロードリクエストのレート(約600リクエスト/秒)が示されていません。また、バックログのサイズや保持容量も示されていないため、9点以上の基準は満たしていません。

分かりやすさ

80

番号付きのセクションで構成され、計算過程も明確に示されており、構成は分かりやすいです。ただし、表現に細かな不整合があります。例えば、アップサートで書き込まれているのに「追記専用」と呼ばれている台帳や、欠損区間を「不明」と記述しながら区切りとして扱っている点です。

GPT-6.1 Sol 7.37

この回答は、容量とバーストに関する計算をすべて正しく行っており、データベースで課金の重複排除を強制する、信頼できる永続ログ型のアーキテクチャを示しています。主な弱点は、バックログと復旧の計画が十分に具体化されていないこと、ダッシュボードのSLOのカバーが不完全であること、そして、遅れて到着した読み取り値によって、それまで分かれていた連続区間が結合される場合に、重複アラートを出さずにどう処理するのかを、漏水アラートの状態管理が説明していないことです。3つのトレードオフは明確で、関連性も高いです。

評価基準ごとの点数

設計の質

65

永続ログによる取り込み境界と請求台帳の一意キーは、再試行と正確に1回だけの計数に正しく対応しています。漏えい処理はinterval_startを使用し、欠測区間を明示的に連続区間の途切れとして扱っていますが、遅延データが以前に分かれていた連続区間をつなぐ場合、カウンタとリセット可能なアラートフラグでは正しさを保証できません。この設計には、履歴に基づく連続区間の再計算と、既に出力されたアラートの照合に加え、復旧後の重複を防ぐための永続的またはトランザクション的なアラート出力が必要です。コンシューマのチェックポイント順序と生データ保持の実装も十分に規定されていません。

完全性

75

求められた計算はすべて含まれており、400日分のレプリカ済みストレージとバーストピークでのライブトラフィックも含まれています。回答は請求の重複排除コンポーネントを挙げ、欠測区間のルールを示し、採用と不採用を比較する トレードオフをちょうど3つ示しており、測定された語数の範囲も満たしています。ただし、通常運用時に読み取り値の99%を5分以内に表示するという要件には明示的に触れておらず、バースト時のダッシュボード目標は処理予算の裏付けなしに示されています。

トレードオフの説明力

83

トレードオフはちょうど3つあり、それぞれ採用案と不採用案の両方を特定しています。ACKのタイミングは30秒の再試行タイムアウトに直接結び付けられ、イベント時刻処理はバッファリングされた到着データに結び付けられ、ダッシュボードの分離は請求ワークロードを保護しています。ただし、一部の根拠は誇張されています。再試行が指数関数的に増える必要はなく、インデックス付きまたは増分のバッチ検出が数十億行をスキャンする必要もありません。採用した選択肢のコスト、特に運用の複雑さと別々のプロジェクションの維持にはほとんど触れられていません。

拡張性・信頼性

71

期待される容量値はすべて正しく、ピーク時の約15,733読み取り/秒、レプリカ済み生データ保持の27.648 TBも含まれています。提案された50,000メッセージ/秒の取り込み目標は余裕を提供し、耐久性のあるキューイングはバースト吸収策として適切です。ただし、バースト吸収の説明は曖昧で、キュー/バックログの容量、持続的なコンシューマのスループット、排出時間の計算がありません。そのため1点減点としています。耐久的なKafka受理に必要なレプリケーションと確認応答の設定は規定されていません。また、回答はバッチアップロードのリクエストと読み取り値を区別しておらず、50ミリ秒未満のACKでは再試行のすべての状況を排除できません。

分かりやすさ

84

番号付きのセクション、明示的な数式、採用/不採用のラベルにより、回答は検証しやすくなっています。用語と単位は概ね明確です。細かな弱点として、「partitions are partitioned」という冗長な表現、messages と readings の曖昧な使い分け、そして欠測区間を「不明」かつ直ちに連続区間を途切れさせるものとして同時に記述しており、その後に遅れて届くデータがその状態をどう改訂するかを説明していない点が挙げられます。

Gemini 3.8 Flash 8.76

この設計は網羅的で技術的にも妥当であり、プロンプトの要求に完全に応えています。容量とバースト負荷の計算はすべて正確で、定常スループット、1日あたりのデータ量、レプリケーション後の保持容量、ピーク時のバースト負荷について、算術が明確に示されています。課金のための重複排除と、漏水検知のステートマシン(遅延到着データや明示的な欠損データの扱い方針を含む)は、よく設計されています。3つのトレードオフは、この問題領域に直接合わせて作られています。最上位の基準に照らした場合の唯一の小さな欠落は、アップロードのHTTPリクエストレート(例:メーターが24件の測定値をまとめて送信する場合、毎秒約600リクエスト)を、個々の測定値のスループットと明確に区別していない点です。

評価基準ごとの点数

設計の質

88

アーキテクチャは、エッジでの取り込み、ストリームベースの冪等性、永続ストレージの各関心事を明確に分離しています。(meter_id, interval_start) に対する主キー制約と、48時間のRocksDBスライディング重複排除フィルタにより、課金の正確に一度だけの処理を保証しており、キューの配信セマンティクスのみに依存するといったよくある反パターンを避けた堅牢な設計です。

完全性

87

求められた5つのセクションすべてが、指定された800~1,100語の範囲内で詳しく扱われています。満点に届かない唯一の点は、再接続時のバーストにおけるアップロードリクエスト率と個々の計測値のレートの内訳が明示されていないことです。

トレードオフの説明力

88

トレードオフは正確に3つ示されており、それぞれ採用した選択肢と退けた選択肢が明記され、システム要件に結びついた具体的な根拠が示されています(キューレベルのACKとデータベースACKの比較、漏水検知におけるストリーム状態とバッチSQLの比較、ダッシュボード用の別個の読み取りモデルストレージと課金RDBMSへの問い合わせの比較)。

拡張性・信頼性

87

容量の見積もりは期待される数値と正確に一致しています(定常1,333.33 rps、23.04 GB/日、レプリケーション後の生データ保存量27.648 TB、バースト14,400 + 定常1,333 = ピーク15,733.33 rps)。パーティション分割されたKafkaとコンシューマのスロットリングによるサイジングとバッファ吸収の方策は妥当ですが、バッチのリクエストレート(例:600 req/s)を明示的には計算していません。

分かりやすさ

88

明確な見出し、明示的な数式、簡潔な技術的説明により、回答は論理的に構成されています。語数(984語)は目標範囲内に十分収まっています。

6 Gemini 3.5 Flash-Lite

平均(10点満点) 7.41

スマートメーター取り込みアーキテクチャ

1. 容量の見積もりと計算

120万台のスマートメーターに対応する堅牢なバックエンドを構築するため、まず決定的な容量とストレージの規模を算出します。

  • 定常状態の毎秒読み取り数: 各メーターは15分ごと(900秒)に1件の読み取りデータを送信します。120万台の場合、平均取り込みレートは $1,200,000 / 900 = 1,333.33$ 件/秒です。
  • 1日あたりの生データ量: 1,333.33件/秒では、1日の読み取り総数は $1,333.33 \times 86,400 = 115,200,000$ 件/日となります。通信上の各読み取りデータが200バイトである場合、1日の生データ量は $115,200,000 \times 200 \text{ bytes} = 23,040,000,000 \text{ bytes/day...
全文を表示 ▼

スマートメーター取り込みアーキテクチャ

1. 容量の見積もりと計算

120万台のスマートメーターに対応する堅牢なバックエンドを構築するため、まず決定的な容量とストレージの規模を算出します。

  • 定常状態の毎秒読み取り数: 各メーターは15分ごと(900秒)に1件の読み取りデータを送信します。120万台の場合、平均取り込みレートは $1,200,000 / 900 = 1,333.33$ 件/秒です。
  • 1日あたりの生データ量: 1,333.33件/秒では、1日の読み取り総数は $1,333.33 \times 86,400 = 115,200,000$ 件/日となります。通信上の各読み取りデータが200バイトである場合、1日の生データ量は $115,200,000 \times 200 \text{ bytes} = 23,040,000,000 \text{ bytes/day}$(すなわち23.04 GB/日)です。
  • レプリケーションを含む保持期間全体の生ストレージ: データは3つのレプリカを持った状態で400日間保持する必要があります。総ストレージの計算は $23.04 \text{ GB/day} \times 400 \text{ days} \times 3 \text{ replicas} = 27,648 \text{ GB}$(すなわち27.64 TB)です。

2. 取り込み経路と再接続時のバースト規模の算出

大規模な嵐が発生すると、メーターの30%(360,000台)が6時間にわたって通信不能になります。6時間の間に、切断された各メーターは $6 \times 4 = 24$ 件の読み取りデータをバッファリングします。通信が復旧すると、360,000台すべてのメーターが、10分(600秒)のウィンドウに均等に分散させながら、バッファリングした24件の読み取りデータをアップロードします。

  • バッファリングされたアップロードレート: バースト中の過去の読み取りデータのレートは、$(360,000 \text{ meters} \times 24 \text{ readings}) / 600 \text{ seconds} = 8,640,000 / 600 = 14,400$ 件/秒です。
  • 同時のライブレート: 同時に、120万台すべてのメーターが $1,333.33$ 件/秒で通常のライブ読み取りデータの送信を継続します。
  • ピーク取り込みレート: ピーク時の合計レートは $14,400 + 1,333.33 = 15,733.33$ 件/秒(約15.7k rps)です。

読み取りデータを一切失うことなくこの急増を吸収するため、取り込み層では、64パーティションに分割された水平スケーラブルな分散メッセージブローカー(Apache Kafkaなど)を使用します。ロードバランサーの背後にあるAPIゲートウェイ群がTLSを終端し、高速なスキーマ検証を行ったうえで、メッセージブローカーに直接書き込みます。Kafkaのパーティションが取り込みと下流処理を分離するため、急増はディスクバックアップされたコミットログに安全にバッファリングされます。コンシューマワーカーはコンシューマラグに基づいて動的にスケールし、データを失うことなく一時的な急増を処理します。

3. べき等性と正確に1回の課金

メーターは30秒以内に確認応答を受け取らないとアップロードを再試行するため、重複データは必ず到着します。課金が各 (meter_id, interval_start) を正確に1回だけカウントすることを保証するため、課金ストリームプロセッサ内でべき等性を適用します。

受信する各読み取りペイロードには、複合自然キーが含まれています。すなわち meter_id と interval_start です。課金ストリームプロセッサは、メッセージブローカーから読み取りデータを消費し、分散列指向データストア、または重複排除用の状態ストア(Apache Flinkに統合されたRocksDBなど)に対してアトミックなupsert操作を実行します。

読み取りデータが到着すると、プロセッサは (meter_id, interval_start) のレコードがすでに処理・課金済みかどうかを確認します。キーが存在する場合、重複ペイロードは安全に破棄されるか、重複としてマークされ、二重計上がゼロであることが保証されます。キーが存在しない場合、課金テーブルが更新され、確認応答が取り込みブローカーに返送されます。

4. 遅延到着データと漏水アラート

漏水検知では、メーターが(全24時間にわたる)連続する96の15分間隔のすべてで非ゼロの流量を示しているかどうかを特定する必要があり、到着時刻ではなく interval_start で厳密に評価します。バッファリングされた読み取りデータが遅延して順不同に到着しても漏水アラートが正しく保たれるよう、ウォーターマークを用いたイベント時間ストリーム処理を採用します。

  • 遅延データの処理: ストリームプロセッサは、meter_id をキーとする状態ウィンドウを維持します。メーターは最大48時間データをバッファリングできるため、ストリーム処理ウィンドウは48時間の許容遅延しきい値で構成されます。これにより、遅延または再接続後のバッチアップロードが到着した際、それらのデータが interval_start のタイムスタンプに基づいて、正しい時系列の15分ビンに遡及的に割り当てられます。
  • 欠損間隔: 15分間隔がストリームから完全に欠落し、そのデータを受信しないまま48時間の遅延ウィンドウが閉じた場合、その間隔はゼロ流量(または連続した連続性を断ち切る欠損データ)として明示的に扱われます。欠損した読み取りデータは非ゼロ流量の連続を途切れさせ、そのメーターの96間隔連続カウンタをリセットします。
  • アラートの発報: メーターが96の連続した非ゼロ間隔を蓄積すると、システムは連続期間ごとに正確に1件のアラートを発報します。同じ連続した実行内の後続の非ゼロ読み取りデータは、アクティブな連続カウンタとともに保存される状態を持つ重複排除フラグにより、重複アラートを生成しません。

5. アーキテクチャ上のトレードオフ

システム設計を確定するため、3つの重要なアーキテクチャ上の選択肢を評価します。

  1. 取り込みプロトコル: 採用案(TLS上のJSONを用いたHTTP/REST)対 不採用案(MQTT / カスタムTCPソケット). カスタムTCPソケットやMQTTはペイロードのオーバーヘッドが軽量ですが、HTTP/RESTとJSONはセルラーおよびIoTゲートウェイモジュールで広くサポートされており、デバッグが容易で、既存のAPI管理ファイアウォールとネイティブに統合され、専用のファームウェアプロトコルスタックを必要とせずに200バイトの通信サイズ要件を容易に満たせます。
  2. ストレージのパラダイム: 採用案(コールドデータ用のオブジェクトストレージParquetファイル + ホットデータ用の分散ログ)対 不採用案(従来の分散リレーショナルSQLクラスタ)。 従来のリレーショナルデータベースクラスタで400日分の履歴時系列データと3つのレプリカを保持すると、法外なインフラコストと複雑な水平シャーディングの制約が生じます。圧縮された生の読み取りデータを、オブジェクトストレージ(例: AWS S3)上の列指向Parquetファイルに格納し、サーバーレスクエリエンジンで照会することで、アクティブな運用経路の高速性を維持しつつ、費用対効果の高い長期保持を実現します。
  3. ダッシュボードの整合性: 採用案(読み取りモデルのプロジェクションによる結果整合性)対 不採用案(同期的なリードスルーのデータベース照会)。 大規模な再接続バースト(15.7k rps)の最中もダッシュボード照会の応答性を保証するため、通常の負荷時には5分以内に顧客ダッシュボードを更新する(嵐の期間中は60分まで緩和する)非同期の読み取りモデルプロジェクションを採用しました。同期的なリードスルー照会は、ピーク時の取り込みバースト中にプライマリのトランザクションストアをロックまたは照会すると、連鎖的なタイムアウト、データベース接続プールの枯渇、そして取り込み失敗の可能性を招くため、不採用としました。
Claude Opus 5.5 6.74

期待される数値はすべて正しく示されています。1,333件/秒の読み取り、1日あたり23.04 GB、複製後の合計約27.65 TB、そして定常負荷を含む15,733件/秒のバーストです。必要なセクションはすべてそろっており、回答は語数制限内に収まっています。弱点は深さと精度です。バースト吸収の計画には、バックログや保持期間のサイジングがなく、アップロードリクエストと読み取りを区別しておらず、バースト時のダッシュボードの性能低下にも触れていません。正確に1回の課金に向けた確認応答(ACK)の経路は不明瞭で、ACKは、永続的な書き込みの後にメーターへ返されるのではなく、「ブローカー」に送られる形になっています。トレードオフの一部はかなり一般的な内容にとどまっています。

評価基準ごとの点数

設計の質

63

流れは明確で、APIゲートウェイ、64パーティションのKafkaクラスタ、(meter_id, interval_start)で重複排除を行うFlink課金プロセッサ(RocksDBの状態ストアまたはupsertによる)、そして48時間の許容遅延を伴うイベント時刻ベースの漏えい検知が示されています。強制を担うコンポーネントも明記されています。しかし、確認応答のセマンティクスが曖昧です。確認応答は、耐久書き込みの後にメーターへ返されるのではなく、「取り込みbrokerへ送り返される」とされています。重複排除状態の保持期間は指定されていません。遅れて到着したデータで欠測が埋まった場合の漏えい連続判定の再評価も、大まかにしか説明されていません。

完全性

75

5つの要件すべてに対応しています。容量計算、バーストのピーク、正確に1回処理の課金コンポーネント、明示的な欠測ルール(48時間の遅延ウィンドウが閉じた時点で欠測が連続を断ち切る)を伴う遅延データの漏えい処理、そして3つのトレードオフです。回答は語数範囲内です。ただし、バースト吸収の詳細と、耐久書き込み後に確認応答を行うという保証は、いくつかの項目が薄いままです。

トレードオフの説明力

65

トレードオフはちょうど3つあり、それぞれ採用された選択肢と却下された選択肢が挙げられています。ダッシュボードの読み取りモデルと同期クエリのトレードオフは、バーストおよび5分/60分のSLAと結び付けられています。HTTPとMQTTのトレードオフ、そしてParquet/オブジェクトストレージと関係型SQLのトレードオフは、やや一般的です。200バイトのサイズに関するHTTPの理由付けは弱いです。

拡張性・信頼性

65

すべての期待値は正しく、ピークには定常負荷が含まれています。吸収は、Kafkaのディスクバッファリングとコンシューマの自動スケーリングによってのみ主張されています。バックログや保持期間のサイジング、パーティションのスループット確認、約600アップロードリクエスト/sと読み取り値/sの区別、そしてバーストのセクション内で明示的なダッシュボード劣化計画はありません。メーターへの確認応答より前に耐久的な確認応答を行うことによる損失なしの保証も、明確には述べられていません。

分かりやすさ

75

回答は整理されており、見出しは要件に対応し、計算は段階的に示されています。表現はおおむね正確です。ただし、欠測区間の表現(「ゼロフロー(またはデータ欠落...)」)と確認応答の説明に、わずかな曖昧さがあります。

GPT-6.1 Sol 7.00

この回答は、容量とバーストの計算を正しく行っており、語数制限も守っていて、採用案と却下案のトレードオフをちょうど3つ示しています。しかし、バースト時のバッファリング計画は定量的にサイズが見積もられておらず、課金設計はクラッシュに耐えられる exactly-once の保証を確立できていません。また、漏水アラートのロジックは、遅延データによる連続発生(ストリーク)の再調整を十分に説明できていません。

評価基準ごとの点数

設計の質

60

ブローカーを介した取り込み経路と課金の自然キーは適切です。しかし、重複排除ストアの確認と課金の更新が、明示的に一つのアトミックで永続的な操作になっていないため、クラッシュ時に課金更新が失われたり二重計上されたりする可能性があります。説明されている確認応答はブローカーへのものであり、耐久的な取り込み後のメーターからの確認応答ではありません。イベント時刻のビンと欠損区間のルールは示されていますが、過去の連続期間の再評価や、遅延した測定値が別々だった実行に結合されたときの警告の同一性は、十分に規定されていません。

完全性

80

941語の回答は、求められた5つの領域すべてを扱っており、容量の計算を含み、ライブトラフィックをバーストに明示的に加算し、課金の強制コンポーネントを挙げ、欠損区間のルールを示し、トレードオフをちょうど3つ提示しています。ダッシュボードのレイテンシ目標にも触れています。構成としては網羅的ですが、いくつかの保証は立証されずに主張されているにとどまります。

トレードオフの説明力

75

ちょうど3つのトレードオフが、選択案と却下案を明確に示しており、保持コストやバースト時のダッシュボード分離との関連も有用です。プロトコルの比較では、JSONとHTTPが与えられたワイヤサイズの前提に収まることが実証されていません。ストレージとダッシュボードの比較では、リレーショナルストレージや同期クエリに本質的に存在する不利な点を誇張しています。選択した案のコストへの言及は限定的です。

拡張性・信頼性

65

定常レート、1日あたりの量、レプリケーションされた保持ストレージ、およそ15,733 readings/sのバーストは正しく計算されています。しかし、64パーティションと動的なコンシューマのスケーリングでは、プロビジョニングされた取り込みスループットや十分なバックログ容量を立証できていません。定量的なキューのサイジング、ドレイン時間の計算、リトライの余裕、レプリケーション書き込みの明示的な確認応答ポリシーは示されていません。バッファリングされた測定値のスループットと、アップロードのリクエストスループットも区別されていません。

分かりやすさ

80

回答は整理されていて読みやすく、要求された範囲に収まるよう簡潔にまとめられており、計算過程やラベル付きのトレードオフも明確に示されています。ただし、課金ストアの代替案が互換的に書かれている点や、ブローカーへ送られる確認応答の説明には曖昧さが残ります。測定値の処理量を「rps」で表し、リクエストと区別していない点も、取り込みのサイジングを分かりにくくしています。

Gemini 3.8 Flash 8.49

この設計は、プロンプトの5つの要件すべてに丁寧に対応しており、定常状態とバースト時の両方のシナリオについて、数学的な計算が完全に正確です。また、請求の重複排除によるexactly-once処理と、遅れて到着するイベント時刻ベースの漏水検知について、明示的な欠測処理ポリシーを備えた妥当なアーキテクチャ上の仕組みを示しています。ただし、再接続時のバースト中において、アップロードのHTTPリクエストと個々の測定値のスループットを区別していません。また、キュー全体のバックログ容量も定量化していません。そのため、9.0以上の基準にはわずかに届いていません。

評価基準ごとの点数

設計の質

85

アーキテクチャは、取り込みゲートウェイ、Kafkaのコミットログ、イベント時刻ベースのストリーム処理、課金ストアの間で関心事を明確に分離しています。課金における正確に1回だけの処理では、トランスポート層の保証だけに頼るのではなく、複合キー(meter_id, interval_start)をアトミックなupsert/状態ストアで使用しており、適切です。リークアラートのアーキテクチャは、イベント時刻ウィンドウを用いて順序が入れ替わったデータを正しく扱い、48時間の遅延ギャップ規則を明確に示しています。

完全性

88

主要なチェックリスト項目はすべて扱われています。計算過程が示されており正確であること、同時並行のライブトラフィックを含むバーストがモデル化されていること、重複排除の責任が明確に割り当てられていること、欠損インターバルの動作が明確に述べられていること、そして選択肢と非選択肢を含む、ちょうど3つのトレードオフが示されていることです。語数(941語)は800〜1,100語の範囲内に十分収まっています。

トレードオフの説明力

82

選択された代替案と却下された代替案を技術的な根拠とともに明示し、ちょうど3つのトレードオフを提示しています。プロトコルとダッシュボードの予測に関する選択は運用パラメータとよく結び付いています。一方、ストレージに関するトレードオフは、時系列に特化した代替案(専用TSDBやLSMツリーベースのストアなど)を検討するのではなく、やや一般的な内容(オブジェクトストレージ上のParquetとリレーショナルSQLの比較)にとどまっています。

拡張性・信頼性

83

すべての計算は期待値と完全に一致しており、1日あたりの生データ量(23.04 GB/日)、400日分の3倍レプリケーション保存量(27.65 TB)、そして合計バーストピーク(15,733 rps)が含まれています。ただし、(例えばバッチ処理した場合の約600リクエスト/秒のような)アップロードリクエスト量と個々の計測値/秒を区別しておらず、キューによるバッファリングは定性的に議論されており、バックログのデータ量やディスク使用量は数値として明示的に計算されていません。

分かりやすさ

88

明確なMarkdownの見出し、簡潔な説明、分かりやすい数式によって構成されており、読みやすく評価しやすい内容です。

このジャンルについて

このジャンルでは、主に 設計の質、完全性、トレードオフの説明力 のような力を見ようとしています。

コーディングよりも、構成の選び方、スケールの考え方、信頼性やトレードオフをどう扱うかを重く見ます。

ここで高得点でも、実装コードがそのまま強いとは限りませんし、初心者向けにやさしく説明できるとも限りません。

このジャンルで強いAIが向いている用途

アーキテクチャ検討、技術選定、拡張性や運用性を考えた設計相談です。

このジャンルだけでは判断しきれないこと

低レベルの実装品質、厳密な正確さ、非技術者向けの表現力までは判断しきれません。

このジャンルで評価している項目

このジャンルで使っている採点基準と重みです。

設計の質

30.0%

この項目は、回答の 設計の質 を確かめるために入れています。 比重が重いのは、この部分が弱いとジャンル全体の評価が崩れやすいからです。

完全性

20.0%

この項目は、回答の 完全性 を確かめるために入れています。 比重がしっかりあるのは、全体の良し悪しに目に見えて効いてくる項目だからです。

トレードオフの説明力

20.0%

この項目は、回答の トレードオフの説明力 を確かめるために入れています。 比重がしっかりあるのは、全体の良し悪しに目に見えて効いてくる項目だからです。

拡張性・信頼性

20.0%

この項目は、回答の 拡張性・信頼性 を確かめるために入れています。 比重がしっかりあるのは、全体の良し悪しに目に見えて効いてくる項目だからです。

分かりやすさ

10.0%

この項目は、回答の 分かりやすさ を確かめるために入れています。 比重をやや軽くしているのは、重要ではあるものの、このジャンルの中心そのものではないからです。

関連リンク

X f L