19

アプリに簡単な同期機能を書き込むことを検討していますが、ポップアップした懸念の 1 つは、それぞれ独自のクロックを持つ 2 つのリモート コンピューター間の時刻の同期です (特に、ファイル/オブジェクトの変更日に関して)。

このトピックについて多くの研究が行われていると確信しており、あまり理論的になりたくないのですが、リモートクロック間の時間的な不一致を最小限に抑えるためのベストプラクティスが受け入れられているかどうか疑問に思っています.

たとえば、タイムゾーンの問題を回避するために常に世界時 (UTC) を使用することから始めますが、2 台のコンピューターのシステム時刻がまったく同じであるという保証はありません。幸いなことに、私がやっている仕事はそれほどきめの細かいものではないので、それほど重要な問題ではありませんが、それでもまだ興味があります.

1 つの解決策は、ローカル システム クロックではなく、グローバル タイム サーバーなど、両端で常に同じクロックを使用することです。おそらく、これを (共有リソース ロックと組み合わせて) 同期された時刻が偶発的に重複しないことを保証できますが、あまり実用的ではありません。

私の頭に浮かんだ 1 つの考えは、おそらくシステム クロックのオフセットをグローバル タイム サーバーで計算することによって、各ノード (各クライアント) を、ある時点で計算されたオフセットと同期させることです。オフセット自体は短期間で大きく変化する可能性は低いため、これは時々行うだけで済みます。

更新: 2 台のコンピューターのシステム クロックを実際に同期することに興味がないことを付け加えておきます。ほとんどの場合、オペレーティング システムがこれを処理すると思います。これは、アプリケーションの 2 つのインスタンスが同期された時刻を使用していることを確認する方法の問題にすぎませんが、この時代では、システム クロックはとにかく非常に小さなデルタ内でほぼ確実に同期されると思います。

4

9 に答える 9

20

他の人が推奨しているように、アプリケーションをNTPに依存するのは簡単なことです。正しいアプローチは、Lamportの分散クロック同期アルゴリズムを使用することです。それは彼の古典的な1978年の論文Time、clocks、および分散システムでのイベントの順序で説明されています。

于 2008-12-23T17:25:25.123 に答える
8

" Network Time Protocol " (NTP) 仕様を見てください。

于 2008-12-23T16:57:52.683 に答える
6

PTPを試すことができます。PrecisionTimeProtocol(PTP)は、コンピューターネットワーク全体でクロックを同期するために使用されるプロトコルです。ローカルエリアネットワークでは、サブマイクロ秒の範囲のクロック精度を実現し、測定および制御システムに適しています。 http://en.wikipedia.org/wiki/Precision_Time_Protocol

于 2013-03-07T17:26:09.217 に答える
3

これは、以前の寄稿者による賢明な提案を混乱させるために多くのことを行うことができる、洗練されていないエンドユーザーに関して私が現在解決しなければならない問題です。洗練されていないエンドユーザーは、少なくとも次のことを実行できます。

1)ntp時刻同期を設定するための十分なコンピューティング知識がありません

2)コンピューターのタイムレコーダーを家の時計または携帯電話の時計が正しくないものに設定する

3)Windows XPで、誤ってntp time syncを無効にして、再度有効にする方法がわからない、またはコンピュータの日付が間違って設定されている場合、Windowsntpは機能しません。

4)コンピューターのBIOSバッテリーが切れたため、PCは常に1970年に起動します。

5)ユーザーはラップトップを海外に持ち出し、ラップトップの時計を一時的に現地時間に設定しますが、タイムゾーンを変更しないため、PCは誤ったUTC時間を返します!!!

したがって、プログラム自体が時間を管理する必要があります。もちろん、最小限のオーバーヘッドでそれを実行する必要があります。

あなたのプログラムを実行している2人のエンドユーザーが将来同じ絶対時間に何かをするためにプログラムを必要としていると仮定しましょう。

cronジョブの動作方法からいくつかのアイデアを取り入れたこのスキームを提案します。誰かがアイデアの改善を提案できれば幸いです。

1)アプリケーションが起動すると、サードパーティのサーバーまたは独自のタイムサーバー(ntpで時間どおりに管理できます)へのsoap呼び出しを介して、独自の内部utc時間をntpに同期します。

2)その後、システムクロックからの経過時間を加算して時間を維持します。要件が厳しい場合は、ntp同期を定期的に繰り返す必要があります。

3)次に、アプリケーションは、時間どおりに実行する必要がある将来のジョブのリストを調べます。それは最も早い仕事を知る必要があります。

4)次に、最初のジョブの前に、安全マージンを差し引いた時間だけスリープ状態にするスレッドを作成します。これは、要件に応じて、10分前、1時間または2時間前などになります。

5)スレッドがウェイクアップすると、さらにsoap呼び出しで絶対時間を再チェックし、システムタイムクロックを使用して、最初のジョブを実行する時間に達するまでの経過時間を追加します。

6)ジョブがトリガーされると(別のスレッドで実行されると)、時間監視スレッドは次のタスク時間を計算し、その間再びスリープ状態になります。

アイデアの強化:

1)ユーザーが期限前にアプリケーションを終了する可能性があるため、データベースまたはファイルに保存されているジョブリストを個別に監視し、起動するために、上記と同じ同期スキームを使用するバックグラウンドプロセスまたはサービスが必要になる場合があります。時間内のアプリケーション。(Windowsでは、アプリケーションプロセスを生成します)

2)アプリケーションが新しい以前のジョブをオンザフライで追加したり、ジョブを削除したりしている可能性があるため、新しい以前のジョブまたは削除されたジョブに続くジョブを再計算するには、スリープ状態のスレッドをウェイク可能にする必要があります。Win32では、スレッドがイベントをタイムアウトして待機することでこれを行います。イベントは、スリープ時間を再計算するように強制するように設定します。Linuxにも同様のメカニズムがあることは間違いありません。

3)Soap呼び出しで時間を取得するには、Soapが送信されたときと応答が受信されたときをメモしておきます。所要時間が長すぎると、その時間に頼ることができず、電話を繰り返す必要が生じる可能性があります。そうしないと、妥協する可能性があります。たとえば、Soapがコンピューターの時計が5分速いと言っていても、Soapの呼び出し自体が応答するのに1分かかった場合、コンピューターの時計が少なくとも4分速いとしか言​​えません。

于 2009-10-31T13:34:27.073 に答える
3

それらをNTPネットワーク タイム プロトコルと同期します。

どのプラットフォームを使用していますか?

NTP を使用すると、コンピューターの時刻を原子時計と同期させ、世界の公式時刻を使用できます。

于 2008-12-23T16:57:45.553 に答える
3

クロックを同期するコードを書く代わりに、両方のマシンで ntp クライアントを実行するだけでよいのではないでしょうか?

または、上記の方法が不可能で、アプリが時間を設定するのに十分な権限で実行されている場合、アプリケーションに最小限の NTP クライアントを実装して、公開サーバーと同期させようとするでしょう。誰かのプライベートサーバーをハードコーディングしないでください...

于 2008-12-23T16:58:37.453 に答える
2

私たちが行うことの 1 つは、基本的にすべてのタイミング操作を「ホスト」マシンにオフロードすることです。たとえば、DB を共有する 20 台のサーバーがある場合は、DB の時間を使用します。1 つの中央サーバーと 100 万台のクライアント マシンがある場合、クライアント マシンはタイミングを決定する必要はありません。すべての同期をサーバー側で行います。P2Pネットワークなどの真の「分散型」環境では、問題のリソースを最も直接「所有」しているマシン(書き込みたいファイルを実際のPC)を使用して、ファイルへのアクセスを同期/制御します。

于 2008-12-23T17:18:37.663 に答える
0

NTP を使用しないでください。NTP は、日付/時刻の取得のみを目的としています。

通信しないアプリ間でイベントを同期するために機能します。たとえば、アラームアプリとあなたの体。

Diomidisが言ったように、直接通信し、リソースを共有するアプリの場合は、ランポートクロックまたはベクトルクロックを使用してください。ランポート クロックは、イベント間の半順序を実現するのに最適です。ベクトル クロックは、同時イベントを識別する必要がある場合に最適です。

于 2011-07-15T20:19:38.317 に答える
0

ネットワーク化されたマシンはすべて NTP を使用する必要があります。最新のすべてのシステムには、これを簡単にセットアップする方法が含まれています。少し余分な精度が必要な場合、唯一の問題は特定のサーバーを選択することです。しかし、それはすでにミリ秒の範囲にあるので、私は気にせず、通常は pool.ntp.org を指すだけです

于 2008-12-23T17:04:17.803 に答える