私は現在、サーバーとすべてのクライアント間で適切な時刻同期を本質的に必要とするアプリケーションを構築しようとしています。この同期の必要性をなくすことができる私のアプリケーション用の代替設計がありますが、私のアプリケーションは同期が存在しないとすぐに機能しなくなります。
何か不足している場合に備えて、私の基本的な問題は次のとおりです。複数の場所でまったく同時にイベントを発生させます。私が知る限り、これを行う唯一の方法はある種の時刻同期を必要としますが、私は間違っているかもしれません。問題を別の方法でモデル化しようとしましたが、すべて a) つまらないアプリ、または b) 時刻同期が必要です。
同期された時間が本当に本当に必要だと仮定しましょう。
私のアプリケーションは Google AppEngine で構築されています。AppEngine はサーバー間での時刻同期の状態について保証しませんが、通常は数秒程度 (つまり NTP よりも優れている) で非常に良好ですが、10 秒程度遅れる場合もあります。同期の。私のアプリケーションは 2 ~ 3 秒の同期のずれを処理できますが、ユーザー エクスペリエンスに関しては 10 秒は問題外です。基本的に、私が選択したサーバー プラットフォームは、信頼できる時間の概念を提供しません。
私のアプリケーションのクライアント部分は JavaScript で書かれています。ここでもまた、クライアントが信頼できる時間の概念を持っていない状況があります。私は測定を行っていませんが、私の最終的なユーザーの何人かは、1901 年、1970 年、2024 年などに設定されたコンピューターの時計を持っていることを完全に期待しています。基本的に、私のクライアント プラットフォームは信頼できる時間の概念を提供しません。
この問題は私を少し怒らせ始めています。これまでのところ、HTTP の上に NTP のようなものを実装するのが最善だと思います (これは思ったほどクレイジーではありません)。これは、インターネットのさまざまな場所に 2 つまたは 3 つのサーバーを設置し、従来の手段 (PTP、NTP) を使用して同期が少なくとも数百ミリ秒のオーダーであることを確認することで機能します。
次に、これらの HTTP 時刻ソース (および XMLHTTPRequest から入手できる関連するラウンドトリップ情報) を使用して、NTP 交差アルゴリズムを実装する JavaScript クラスを作成します。
お分かりのように、このソリューションも非常に時間がかかります。それは恐ろしく複雑であるだけでなく、問題の半分を解決するだけです。つまり、クライアントに現在の時間の適切な概念を与えることです。次に、サーバーで妥協する必要があります。クライアントが要求を行うときに、クライアントがサーバーに応じて現在の時刻を伝えることができるようにする必要があります (大きなセキュリティではありませんが、これのより明白な乱用のいくつかを軽減できます)。または、サーバーが魔法の HTTP-over-NTP サーバーの 1 つに単一の要求を作成し、その要求が十分に迅速に完了することを期待します。
これらの解決策はすべて最悪で、私は道に迷っています。
注意: Web ブラウザーの束 (できれば 100 以上) が、まったく同時にイベントを発生できるようにしたいと考えています。