5

私は akka のドキュメントを読んでいて、彼らがGossipを実装する方法を理解するのにいくつかの問題を思いつきました。(ドキュメントはこちら)。私を混乱させた部分(私のものを強調):

定期的に、デフォルトは 1 秒ごとで、各ノードは別のランダムなノードを選択してゴシップのラウンドを開始します。ノードの ½ 未満が 表示されたセットに存在する (新しい状態を確認した) 場合、 クラスターは毎秒 1 回ではなく 3 回ゴシップします。この調整されたゴシップ間隔は、状態変化後の初期の普及段階で収束プロセスをスピードアップする方法です。

そのため、ゴシップ ラウンドが最初の場合 (現在の状態を確認したノードが ½ 未満のノード)、見たセットのノードは 1 秒あたり 1 秒ではなく 3 ゴシップを送信し始めます。しかし、ゴシップの収束が起こった場合、彼らはそれをどのように知ることができますか (彼らはまだゴシップを毎秒 3 回送信し続けています)。それとも、他の「クラスター イベント」と同じように、収束がクラスター全体で噂されているのでしょうか。

4

2 に答える 2

3

ご存じのように、すべてのノードが表示されると、ゴシップの収束が発生します (つまり、すべてのメンバー ノードがゴシップ イベントの表示リストに含まれます)。クラスターが収束していない場合、ClusterDeamon はゴシップを高速化します。

def gossipTick(): Unit = {
    gossip()
    if (isGossipSpeedupNeeded) {
      scheduler.scheduleOnce(GossipInterval / 3, self, GossipSpeedupTick)
      scheduler.scheduleOnce(GossipInterval * 2 / 3, self, GossipSpeedupTick)
    }
  }

def isGossipSpeedupNeeded: Boolean =
    (latestGossip.overview.seen.size < latestGossip.members.size / 2)

クラスターが収束すると、構成されたゴシップ間隔を使用して、通常のスケジュールされたゴシップ ティックに戻ります。この機能のソーステスト仕様を見てください。お役に立てれば。

于 2016-09-11T16:59:47.807 に答える
2

ノードがゴシップするときの他の質問で答えたように、この更新を見た他のノードが含まれています。

gossip はゴシップ先のノードをランダムに選択することに注意してください。このシステムは、更新をまだ見ていないノードを優先して加重ランダムを実装していますが、ノードはまだ更新を見ていない他のノードにゴシップすることができます。これが発生すると、ゴシップ ノードのペアで検出されたセットが更新されます。

ノードは本質的に値についてうわさ話をしてから、誰がその値を見たかについてうわさ話をしています。このプロトコルは、単純化のために 2 つの概念を実際にまとめています。

于 2016-09-12T07:15:04.453 に答える