マスターサーバーからのオフセットを計算することにより、単純な時刻同期アルゴリズムを実装しました。コード自体の処理に多少の遅延があり、タイムスタンプに加算されます。それで、アルゴリズムが実際にシステム間でタイムスタンプを同期しているかどうかをテストする方法を知りたいと思っていましたか?
以下は、nodejsでの時刻同期の私のロジックです
var onSync = function (data) {
var diff = Date.now() - data.t1 + ((Date.now() - data.t0)/2);
offsets.unshift(diff);
if (offsets.length > 10)
offsets.pop();
console.log("Order no ",data.ord,"The offset is ",offsets[0] ,"time in server was = ",data.t1 , "time in the slave = ", Date.now() );
};
システムは socket.io を使用して通信します。サーバーでグローバル変数、つまりグローバルを使用しました。これは、リクエストを取得するたびに更新され、グローバル値が data.ord としてクライアント側に送信されます。
そのため、現在、タイムスタンプをプールし続ける単一のマスターサーバーと複数のスレーブサーバーがあります。以下は私が得る出力です:
マスター ノード:
rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs ob1.js
Current server timestamp is 1395043602717 order no is 1
Current server timestamp is 1395043603263 order no is 2
Current server timestamp is 1395043603717 order no is 3
Current server timestamp is 1395043604264 order no is 4
Current server timestamp is 1395043604719 order no is 5
Current server timestamp is 1395043605265 order no is 6
Current server timestamp is 1395043605720 order no is 7
Current server timestamp is 1395043606267 order no is 8
スレーブ 1:
rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs slave1.js
Order no 1 The offset is 2.5 time in server was = 1395043602718 time in the slave = 1395043602719
Order no 3 The offset is 2 time in server was = 1395043603717 time in the slave = 1395043603718
Order no 5 The offset is 1.5 time in server was = 1395043604719 time in the slave = 1395043604720
Order no 7 The offset is 0 time in server was = 1395043605720 time in the slave = 1395043605720
スレーブ 2:
rahul@g3ck0:~/programs/dos_homework/hw2$ nodejs slave2.js
Order no 2 The offset is 6 time in server was = 1395043603263 time in the slave = 1395043603268
Order no 4 The offset is 2.5 time in server was = 1395043604264 time in the slave = 1395043604265
Order no 6 The offset is 2 time in server was = 1395043605265 time in the slave = 1395043605266
Order no 8 The offset is 2 time in server was = 1395043606267 time in the slave = 1395043606268
ご覧のように
オフセット + タイムスタンプ (マスター) > タイムスタンプ (スレーブ)
しかし、これは一定期間にわたって減少し続けます。全体として、これが正しい方法であるかどうかはわかりません。1.より良いアルゴリズムを実装するにはどうすればよいですか? 2. どのようにテストしますか?