Interactive
ベクタークロック可視化
分散システムでは「どのイベントが先に起きたか」を物理時計で判定できません。ノードごとの時計は必ずずれるからです。ベクタークロックは、各ノードが自分を含む全ノード分のカウンタを持つことで、 因果関係(happened-before)だけでなく「どちらも先とは言えない=並行(concurrent)」を積極的に検出できます。 3ノード(P1/P2/P3)のシーケンス図をステップ再生しながら、各ノードの見出しに現在のベクタ値がライブ表示されます(太字が自分自身の成分)。
P1→P2→P3とメッセージが伝わるだけで、直接通信していない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)を保持してアプリ層に解決を委ねる。