Interactive

ベクタークロック可視化

分散システムでは「どのイベントが先に起きたか」を物理時計で判定できません。ノードごとの時計は必ずずれるからです。ベクタークロックは、各ノードが自分を含む全ノード分のカウンタを持つことで、 因果関係(happened-before)だけでなく「どちらも先とは言えない=並行(concurrent)」を積極的に検出できます。 3ノード(P1/P2/P3)のシーケンス図をステップ再生しながら、各ノードの見出しに現在のベクタ値がライブ表示されます(太字が自分自身の成分)。

P1→P2→P3とメッセージが伝わるだけで、直接通信していないP1とP3の間にも因果関係が刻まれる

ノード P1[1, 0, 0]ノード P2[0, 0, 0]ノード P3[0, 0, 0]1. P1でイベントe1「注文を作成」2. 送信:注文イベントをP2(在庫サービス)へ3. 受信+マージ:P2がP1からのベクタを取り込む4. P2でイベント「在庫を確保」5. 送信:確保完了イベントをP3(配送サービス)へ6. 受信+マージ:P3がP2からのベクタを取り込む7. 判定:e1(P1)とこの受信イベント(P3)の関係は?
ローカルイベント送信受信+マージ判定太字=そのノード自身の成分
1 / 7
ローカルイベント

1. P1でイベントe1「注文を作成」

P1 = [1, 0, 0]

ローカルイベントが起きるたび、自分の成分だけを+1する。これがe1。

ここが分かる

  • ルールはたった3つ——ローカルイベントは自分の成分を+1送信は+1してからベクタ全体を添付受信は要素ごとにmaxを取ってから自分の成分を+1。これだけで因果の伝播が数値として残る。
  • 2つのベクタVA・VBを比較して、全成分でVA≤VBならVA→VB(因果あり)。逆にどちらの向きにも≤が成り立たなければ並行(VA ∥ VB)——これはLamportの整数1つだけのスカラー時計では区別できない、ベクタならではの判定。
  • 並行かどうかはその2つのイベントが起きた時点で決まる固定された事実で、後から通信しても遡って書き換わらない(並行系シナリオの後半で確認できる)。
  • 応用系シナリオの通り、Amazon DynamoやRiakのような分散DBは、同じキーへの並行な書き込みを検出したら自動でどちらかを消さず、両方のバージョン(sibling values)を保持してアプリ層に解決を委ねる。