回答A: OpenAI GPT-5.4
ハイレベルデザイン
3つの主要なパス(ドライバーの取り込み、リアルタイムのファンアウト、クエリ/ストレージ)を備えたイベント駆動型のリアルタイム追跡プラットフォームを構築します。ドライバーはGPSの更新を継続的に公開します。バックエンドはそれらを検証および強化し、ドライバーの最新の位置を更新し、ドライバーをアクティブな配信注文にマッピングし、その注文を追跡している顧客にのみ更新をプッシュします。
1.ドライバーのモバイルからバックエンドへ
各ドライバーアプリは軽量のロケーションパブリッシャーを実行します。
- GPS座標を数秒ごと(アクティブな配信中は約2〜5秒ごと、アイドル時はそれ以下)に収集します。
- driver_id、現在のorder_i...
全文を表示 ▼
ハイレベルデザイン
3つの主要なパス(ドライバーの取り込み、リアルタイムのファンアウト、クエリ/ストレージ)を備えたイベント駆動型のリアルタイム追跡プラットフォームを構築します。ドライバーはGPSの更新を継続的に公開します。バックエンドはそれらを検証および強化し、ドライバーの最新の位置を更新し、ドライバーをアクティブな配信注文にマッピングし、その注文を追跡している顧客にのみ更新をプッシュします。
1.ドライバーのモバイルからバックエンドへ
各ドライバーアプリは軽量のロケーションパブリッシャーを実行します。
- GPS座標を数秒ごと(アクティブな配信中は約2〜5秒ごと、アイドル時はそれ以下)に収集します。
- driver_id、現在のorder_id(割り当てられている場合)、緯度、経度、速度、進行方向、タイムスタンプ、アプリのバージョン、バッテリー/ネットワークのヒント、シーケンス番号を含めます。
- クライアント側のスロットリングと移動ベースのフィルタリングを適用して、アプリが変更されていない位置の送信を回避するようにします。
- 接続不良時には更新をバッチ処理または集約し、再接続時に最新のものを最初に送信します。
ドライバーからバックエンドへの推奨プロトコル:
- HTTPSによる定期的な位置情報のアップロードは、最もシンプルで堅牢な選択肢です。
- Location Ingest APIへの小さなPOSTリクエストを使用します。
- 非常に高い効率のため、モバイルサポートと運用成熟度が利用可能な場合は、gRPCストリーミングも強力なオプションです。
実践的な選択:
- HTTPSから開始します。これはモバイルネットワーク、プロキシ、既存のAPIゲートウェイでうまく機能するためです。
- 圧縮、コンパクトなペイロード、適応的な送信頻度、リージョナルエッジエンドポイントで最適化します。
取り込みフロー:
- ドライバーアプリ
- APIゲートウェイまたはロードバランサー
- 認証とレート制限
- Location Ingest Service
- 非同期処理のためのメッセージブローカー
2.バックエンドサービス
コアサービス
- APIゲートウェイ:TLSを終端し、ドライバーと顧客を認証し、レート制限を適用します。
- Location Ingest Service:ペイロードを検証し、古いまたは重複した更新をドロップし、イベントにタイムスタンプを付け、ブローカーに発行します。
- Message Broker:Kafka、Pulsar、またはKinesis(耐久性の高い高スループットイベントストリーミング用)。
- Driver State Service:位置イベントを消費し、RedisやDynamoDBのような高速ストアで最新のドライバー状態を維持します。
- Order Tracking Service:driver_idをアクティブなorder_idと顧客のサブスクリプションチャネルにマッピングします。
- Realtime Fanout Service:正しい顧客接続に位置更新をプッシュします。
- Order Service:注文のライフサイクル、割り当て、ステータスの変更、レストランでの受け取り、配達完了のソースオブトゥルース。
- ETA Service:最新の交通状況を考慮したルートとドライバーの動きを使用して、オプションでETAを再計算します。
- Historical Storage Service:デバッグ、分析、紛争解決、MLのために位置履歴を保存します。
- Monitoring and Alerting:レイテンシ、ドロップしたメッセージ、古いドライバーの位置、リージョナル障害を追跡します。
処理パイプライン
- ドライバーが位置更新を送信します。
- Ingest serviceが認証、スキーマ、タイムスタンプの鮮度、および妥当性を検証します。
- イベントがブローカーに書き込まれます。
- Driver Stateコンシューマーがdriver_idをキーとする最新の位置キャッシュを更新します。
- Order Trackingコンシューマーが、ドライバーが現在アクティブな注文に割り当てられているかどうかを確認します。
- 該当する場合、顧客スコープの追跡イベントを発行します。
- Realtime Fanoutがサブスクライブしている顧客アプリに更新を送信します。
- Historicalコンシューマーがイベントを長期ストレージに保存します。
3.リアルタイム更新を受信する顧客モバイル
推奨パターン:
- 顧客アプリは、注文追跡画面に入った後、WebSocket接続を開きます。
- アプリは認証され、order_idのような単一の注文追跡チャネルにサブスクライブします。
- バックエンドは、顧客がその注文を表示する権限があることを検証します。
- Fanout serviceはその注文の更新のみを送信します。
- 初回接続時、アプリはスナップショット(最新のドライバー位置、注文ステータス、ETA、最終更新時間)を受信します。
- その後、ほぼリアルタイムで増分更新を受信します。
フォールバック:
- WebSocketがブロックされたり不安定な場合は、Server-Sent Eventsまたはショートポーリングをフォールバックとして使用します。
- バックグラウンドのアプリでは、継続的な追跡ではなく、主要なマイルストーンに対してのみプッシュ通知を使用します。
4.プロトコルの選択と正当化
ドライバーからバックエンドへ:HTTPS POST
- モバイルネットワークでの強力な互換性。
- リトライ、認証、オブザーバビリティ、ゲートウェイ統合が容易。
- 更新が適切にスロットリングされていれば、50,000アクティブドライバーで十分です。
- MQTTよりも運用上の複雑さが少ない。
顧客からバックエンドへ:WebSockets
- サーバーからクライアントへのリアルタイム更新に最適。
- 200,000人の顧客からの無駄なポーリングを回避します。
- 低レイテンシで、多数の小さなプッシュメッセージに効率的。
- 顧客は通常1つの注文を追跡するため、サブスクリプションロジックはシンプルです。
ブローカー内部通信:Kafkaまたは類似のもの
- 取り込みとファンアウトおよびストレージを分離します。
- スパイク、リプレイ、複数のダウンストリームコンシューマーを処理します。
- 水平スケーリングのためにパーティションをサポートします。
顧客のポーリングが推奨されない理由:
- 200,000人のアクティブな顧客がいる場合、頻繁なポーリングは、位置が変わっていない場合でも、大量の不要なQPSを発生させます。
- レイテンシが高く、バッテリー/ネットワーク効率が低下します。
MQTTのエンドツーエンドが推奨されない理由:
- モバイルテレメトリには技術的に適していますが、クライアントとブローカーの複雑さが増し、組織がすでにMQTTを大規模に運用している場合を除き、不要な場合があります。
- このユースケースでは、HTTPSとWebSocketsの方がシンプルで、通常は十分です。
5.データモデル
A.ドライバーの最新位置
目的:リアルタイム読み取りのためのホットステート
フィールド:
- driver_id
- lat
- lng
- geohashまたは空間インデックスキー
- speed
- heading
- accuracy_meters
- recorded_at(デバイスから)
- received_at(サーバーから)
- sequence_number
- active_order_id(nullable)
- status(idle、heading_to_restaurant、waiting、delivering、offlineなど)
ストア:
- 超高速な最新ステート読み取りとpub/subメタデータのためのRedis、または耐久性のあるスケーラブルなキーバリューストアのためのDynamoDB/Cassandra。
- TTLは古いエントリに適用できます。
キー例:
- driver_idをパーティションキーとして使用
B.ドライバーの位置履歴
目的:分析とリプレイ
フィールド:
- driver_id
- timestamp
- lat
- lng
- speed
- heading
- active_order_id
ストア:
- 時系列に適したストレージ、ストリームシンク経由のオブジェクトストレージ、またはワイドカラムデータベース。
- 生のポイントには短い保持期間、要約されたトレースには長い保持期間を設定できます。
C.注文追跡モデル
フィールド:
- order_id
- customer_id
- driver_id
- restaurant_id
- status(placed、preparing、driver_assigned、picked_up、en_route、delivered、cancelledなど)
- pickup_location
- dropoff_location
- latest_driver_lat
- latest_driver_lng
- latest_driver_timestamp
- eta_seconds
- tracking_visibility(boolean)
- assigned_at、picked_up_at、delivered_at
ストア:
- リレーショナルDBまたは分散トランザクションストアでのプライマリ注文レコード。
- 低レイテンシ読み取りのためにRedisまたはDynamoDBでの頻繁に変更される追跡プロジェクション。
D.サブスクリプション/セッションモデル
フィールド:
- connection_id
- customer_id
- order_id
- connected_at
- last_heartbeat_at
- region
ストア:
- Redisのようなインメモリストア、またはマネージドWebSocketゲートウェイ接続レジストリ。
6.ピークロードのスケーリング戦略
トラフィック推定
50,000人のアクティブドライバーが平均5秒ごとに更新を送信する場合:
- ピーク時には約10,000の位置更新/秒。
アクティブな配信のバースト中に2秒ごとに更新する場合: - 約25,000更新/秒。
これは、パーティション化されたイベント駆動型システムの範囲内に十分に収まります。
スケーリングアプローチ
A.ステートレス水平スケーリング
- ロードバランサーの後ろでAPIゲートウェイ、Ingest Service、Fanout Serviceを水平にスケーリングします。
- リクエスト処理はステートレスに保ちます。セッションとサブスクリプションのメタデータは共有高速ストレージに保存します。
B.パーティション化されたイベントストリーミング
- driver_idで位置イベントをパーティション化し、ドライバーごとの順序を保持します。
- パーティションとコンシューマーインスタンスを追加してコンシューマーをスケーリングします。
- ドライバーの状態、顧客のファンアウト、ETA、ストレージのために別々のコンシューマーグループを使用します。
C.高速ホットステートストレージ
- 最新の位置と注文追跡プロジェクションにはRedisクラスターなどを使用します。
- キャッシュには現在の状態のみを保持します。ソースオブトゥルースと履歴には耐久性のあるシステムを使用します。
- 古いドライバーにはTTLとエビクションを使用します。
D.リージョンベースのデプロイメント
- 複数の地理的リージョンにデプロイします。
- レイテンシを削減するために、ドライバーを最寄りのリージョンにルーティングします。
- 可能な場合は、注文と同じリージョンに顧客追跡を維持します。
- グローバルなすべての生イベントではなく、必要なメタデータに対してのみリージョン間レプリケーションを使用します。
E.バックプレッシャーと劣化
- システムが過負荷になった場合、更新を統合し、短い時間ウィンドウあたり最新のドライバー位置のみを発行します。
- 移動の遅いまたは停止しているドライバーの更新頻度を動的に減らします。
- アイドルドライバーのテレメトリよりも、アクティブに追跡されている注文を優先します。
- パイプラインで明らかに古い、置き換えられたイベントをドロップします。
F.効率的なファンアウト
- 広範な地理的サブスクリプションではなく、注文に関連付けられた顧客にのみプッシュします。
- デルタまたはコンパクトなペイロードを送信します。
- バックエンドがより頻繁に受信しても、顧客アプリで視覚的に有用な、例えば最大1〜2秒の更新頻度に制限します。
G.信頼性
- ブローカーで少なくとも1回の配信を使用し、冪等なコンシューマーを使用します。
- driver_idとシーケンス番号またはタイムスタンプで重複排除します。
- ハートビートで切断された顧客とオフラインのドライバーを検出します。
- 再接続した顧客がすぐに回復できるように、最後に知られているスナップショットを永続化します。
H.オブザーバビリティ
追跡するもの:
- ingest QPS
- ドライバー送信から顧客受信までのエンドツーエンドレイテンシ
- 古い位置の割合
- websocket接続数
- ファンアウトの失敗と再接続
- リージョンごとのブローカーラグ
- キャッシュヒット率
推奨されるエンドツーエンドアーキテクチャ
- ドライバーアプリはHTTPSの位置更新を送信します。
- グローバルロードバランサーが最寄りのリージョンにルーティングします。
- APIゲートウェイが認証とレート制限を行います。
- Location Ingest Serviceが検証し、Kafkaに発行します。
- Driver State ServiceがRedisまたはDynamoDBで最新の位置を更新します。
- Order Tracking Serviceがアクティブな注文割り当てと結合し、追跡ペイロードを計算します。
- Realtime Fanout ServiceがWebSocket経由でサブスクライブしている顧客に送信します。
- Order Serviceがライフサイクル遷移を管理します。
- Historical sinkが長期ストレージに生イベントを保存します。
- ETA Serviceが顧客アプリに表示されるETAを定期的に更新します。
主要な設計上の決定の要約
- 堅牢なモバイル取り込みのために、ドライバーからはHTTPSを使用します。
- 低レイテンシのターゲットプッシュのために、顧客からはWebSocketsを使用します。
- 取り込み、状態更新、ファンアウト、ストレージを分離するためにブローカーを使用します。
- 最新の状態は高速キーバリューストアに、履歴トレースは個別に保存します。
- パーティショニング、リージョン化、キャッシング、適応的スロットリングで水平にスケーリングします。
この設計は、低レイテンシ、ターゲットを絞ったリアルタイム更新、運用上のシンプルさを提供し、ピーク需要時に数万人のドライバーと数十万人の追跡顧客をサポートするのに十分なヘッドルームを備えています。
判定
勝利票
3 / 3
平均スコア
総合点
総評
ドライバーの取り込み、バックエンド処理、顧客へのターゲットファナウト、プロトコル選択、データモデル、スケーリング戦略を明確にカバーする、強力で一貫性のあるイベント駆動型アーキテクチャ。実践的な考慮事項(スロットリング、フィルタリング、バッチ処理、フォールバック、リージョンルーティング、バックプレッシャー、べき等性)が良好。マイナーなギャップ:セキュリティ/プライバシーの詳細(トークンスコープ、PII、保存時の暗号化)の議論が限定的、正確なWebSocketスケーリングアプローチ(スティッキーセッション vs マネージドゲートウェイ)、および200k同時ソケットとファナウトスループットのより明確な容量の理由付け(ただし、一般的に示唆されている)。
採点詳細を表示 ▼
設計の質
重み 30%懸念事項(取り込み、ブローカー、状態、注文結合、ファナウト、履歴、ETA)の明確な分離を備えた、よく構造化されたエンドツーエンドの設計。イベントストリーミングバックボーンとホットステートストアは適切であり、ドライバーの更新から顧客固有の更新へのフローは論理的に接続されています。
完全性
重み 20%クライアントの動作、バックエンドサービス、顧客更新メカニズム、プロトコル正当化、データモデル、スケーリングを含む、要求された6つの側面すべてに直接対処しています。注文ごとの認可ルール、プライバシー/保持ポリシー、および具体的なWebSocket接続管理の詳細については、より明確にすることができます。
トレードオフの説明力
重み 20%HTTPSとMQTT、WebSocketとポーリングの正当な理由が示されており、運用上の注意点とともにgRPCをオプションとして言及しています。一部のトレードオフはさらに深く掘り下げることができます(例:マネージドWebSocketゲートウェイのコスト/運用上のトレードオフ、RedisとDynamoDBの耐久性/レイテンシー、割り当て結合の一貫性ニーズ)。
拡張性・信頼性
重み 20%良好なスケーリング計画:水平ステートレスサービス、パーティション化されたストリーミング、TTLホットステート、リージョナライゼーション、バックプレッシャー/コーレッシング、およびべき等キーによる少なくとも1回の配信。信頼性の側面はカバーされていますが、200k同時WebSocketのより明確なサイジング、マルチリージョンのフェイルオーバー戦略、およびブローカー/Redisの障害の処理があれば、より強力になります。
分かりやすさ
重み 10%フィールド、パイプラインステップ、スケーリング見積もりの具体的な例があり、プロンプトセクションごとに整理されており、理解しやすいです。用語は一貫しており、提案されたコンポーネントと相互作用は明確に説明されています。
総合点
総評
これは、プロンプトの6つの側面すべてを徹底的に網羅した、優れた包括的なシステム設計の回答です。アーキテクチャは一貫性があり、構造化されており、大規模なリアルタイムシステムに関する深い理解を示しています。回答は、ドライバーからバックエンドへの通信、バックエンド処理パイプライン、顧客向けリアルタイム更新、プロトコルに関する正当化、データモデル、スケーリング戦略を詳細にカバーしています。さらに、バッテリー消費、バックプレッシャー、オブザーバビリティ、グレースフル・デグラデーション、フォールバック・メカニズムなどの実践的な懸念事項に触れることで、最低要件を超えています。プロトコルの選択は、代替手段が選択されなかった理由についての明確な理由付けとともに、よく正当化されています。データモデルは、適切なフィールド選択とストレージ推奨事項とともに詳細化されています。スケーリング戦略には、具体的なトラフィック見積もりと複数の補完的なアプローチが含まれています。改善のマイナーな領域としては、セキュリティ上の考慮事項、地理的なフェイルオーバーの詳細、そしておそらく視覚的な図の説明がもう少し含まれることが考えられます。全体として、これは本番品質のシステム設計ドキュメントです。
採点詳細を表示 ▼
設計の質
重み 30%アーキテクチャは、取り込み、処理、ファンアウト、ストレージパス全体で関心の分離が明確であり、うまく設計されています。Kafkaを中央ブローカーとするイベント駆動型アプローチは、このユースケースに適しています。ドライバーから顧客までのパイプラインは、適切な分離により論理的に健全です。ETAサービス、履歴ストレージ、監視の組み込みは、成熟したアーキテクチャ思考を示しています。唯一のマイナーなギャップは、個々のコンポーネントの障害モードと、一般的なバックプレッシャーの言及を超えて、システムが部分的な障害をどのようにグレースフルに処理するかについての明示的な議論が欠けていることです。
完全性
重み 20%要求された6つの側面すべてが徹底的に対処されています。回答は、ドライバーからバックエンドへの通信、バックエンドサービス、顧客リアルタイム更新、正当化を伴うプロトコル選択、フィールドレベルの仕様を伴う詳細なデータモデル、および包括的なスケーリング戦略をカバーしています。また、フォールバック・メカニズム、オブザーバビリティ、バックプレッシャー処理、バッテリーに関する考慮事項、および明確なエンドツーエンドアーキテクチャの要約など、追加の貴重な要素も含まれています。データモデルには、必要なすべてのエンティティをカバーする4つの異なるモデルが含まれています。プロンプトの要件で不足している点はほとんどありません。
トレードオフの説明力
重み 20%プロトコルの正当化は強力で、よく議論されています。回答は、ドライバー取り込みにMQTTではなくHTTPSが選択された理由、顧客にポーリングではなくWebSocketが選択された理由、および内部ブローカーとしてKafkaが機能する理由を明確に説明しています。エンドツーエンドでポーリングではない理由とMQTTではない理由の議論は、真のトレードオフ分析を示しています。gRPCを代替として言及し、それが適切になる条件を追加することは、深みを加えています。バッテリー寿命とデータ鮮度をバランスさせるアダプティブ周波数の議論は実践的です。データレイヤーでの一貫性と可用性のトレードオフに関する議論がもう少し含まれる可能性があります。
拡張性・信頼性
重み 20%スケーリング戦略は包括的かつ現実的です。具体的な数値(毎秒10K〜25Kの更新)によるトラフィック見積もりは、設計を現実に根ざしています。回答は、ステートレスサービスの水平スケーリング、パーティション化されたイベントストリーミング、TTLによる高速ホットステートストレージ、リージョン展開、バックプレッシャーとグレースフル・デグラデーション、効率的なターゲットファンアウト、べき等コンシューマーによる少なくとも1回の配信、および重複排除戦略をカバーしています。信頼性セクションは、ハートビート、再接続スナップショット、および古いデータ処理をカバーしています。唯一のマイナーなギャップは、データベースレプリケーション戦略と災害復旧の詳細に関する議論が限定的であることです。
分かりやすさ
重み 10%回答は、明確な見出し、プロンプトに一致する番号付きセクション、およびコンポーネントからコンポーネントへの論理的な流れで、例外的に非常によく整理されています。箇条書き、ラベル付きサブセクション、および末尾の要約の使用により、フォローしやすくなっています。処理パイプラインは、明確なステップバイステップのフローとして説明されています。技術用語は、不必要な専門用語なしで適切に使用されています。提案されたエンドツーエンドアーキテクチャセクションは、良い要約を提供します。唯一のマイナーな問題は、長さが相当であることですが、トピックの複雑さを考えると、詳細は正当化されており、非常によく構造化されています。
総合点
総評
設計は、リアルタイムのドライバー追跡システムを構築するための包括的で説得力のあるアプローチを提供しています。プロンプトのすべての側面に対処し、実践的な技術選択、明確な正当化、スケーラビリティと信頼性に関する確固たる戦略を提供しています。アーキテクチャは詳細で、接続性や負荷などの潜在的な問題も考慮されています。クライアント側のバッテリー最適化について、周波数間引き以外のより明示的な詳細があれば、マイナーな強化の可能性があります。
採点詳細を表示 ▼
設計の質
重み 30%アーキテクチャは堅牢でイベント駆動型であり、適切なサービスとパターン(APIゲートウェイ、メッセージブローカー、マイクロサービス、ホットステート用のRedis/DynamoDB)を使用しています。ドライバーの取り込みから顧客への配信までのデータフローを明確に概説しており、分散システムに対する強力な理解を示しています。ドライバー用のHTTPS、顧客用のWebSocketの選択は、特定のユースケースに対して適切に正当化されています。
完全性
重み 20%プロンプトの6つの側面すべてが徹底的に対処されています。これには、ドライバーデータの送信、バックエンドサービス、顧客データの受信、正当化を伴うプロトコルの選択、さまざまなエンティティ(ドライバーの位置、履歴、注文、サブスクリプション)のデータモデル、およびピーク負荷に対する詳細なスケーリング戦略が含まれます。システムの相互接続とデータフローは明確に説明されています。
トレードオフの説明力
重み 20%プロトコルの選択(HTTPS対gRPC、WebSocket対ポーリング、MQTT)に関する理由は強力で、文脈に沿っています。ドライバーの取り込みには互換性とシンプルさのためにHTTPSを、顧客の更新には効率性と低遅延のためにWebSocketを使用するという正当化は説得力があります。MQTTを回避する説明も、運用の複雑さに焦点を当てており、合理的です。
拡張性・信頼性
重み 20%スケーリング戦略は詳細で、水平スケーリング、パーティション化されたイベントストリーミング、高速ホットステートストレージ、リージョナルデプロイメント、バックプレッシャーメカニズム、効率的なファンアウト、そして少なくとも1回の配信や冪等性のような堅牢な信頼性対策をカバーしています。トラフィック推定はスケーリングアプローチの良い基盤を提供し、オブザーバビリティポイントは信頼性を維持するために不可欠です。
分かりやすさ
重み 10%回答はよく構造化されており、明確な見出しと箇条書きを使用して複雑な情報を提示しています。言語は正確で、設計全体の流れは理解しやすいです。テキストで示唆される図(例:処理パイプライン、エンドツーエンドアーキテクチャの概要)は一貫性があり、設計意図を効果的に伝えています。