2014-03-19 40 views

回答

0

不,ack/nack来自与矢量时钟不同的层。您使用ack/nack来确认包是通过传输层正确传输/接收的(例如TCP)。

矢量时钟在应用程序层。他们确保您可以通过happened before逻辑来订购消息。这与您存储和复制/同步数据时的不同情况相关。

通常在分布式算法中,您可以异步地发送(因此也接收)消息来分割工作或更新结果,而不需要任何直接的答案。这种异步通信降低了网络开销,并增加了吞吐量以及节点可以通信的速度。

想象一下两个进程(人员)在同一个数据集(文档)上工作并相互更新。 过程A和B都开始从0,A的矢量时钟是(0,0)和B,以及(0,0) - 中的每个条目为(A,B)

  1. A做出的改变,并发送A更新至B
    • A:(1,0); B:(0,0)
  2. B产生变化,并发送一个更新甲
    • A:(1,0); B:(0,1)
  3. A做出另一变化和发送一个更新到B
    • A:(2,0); B:(0,1)
  4. A接收到B的更新时,看到一个向量时钟(0,1)
    • A现在知道B没有任何的的更新应用到文档尚未和知道哪些数据需要合并
    • 答:(2,1); B:(0,1)
  5. B接收A的后彼此两个消息,并且需要执行类似的合并
    • A:(2,1); B:(2,1)

现在,如果需要的一个与该变化等到B发送一个确认,发送另一消息之前,它会浪费了很多时间。最后,由于他们同时发送更新并需要合并它们,或者至少有一个流程需要撤销其更改,所以最终会有冲突。