我认为我误解了Lamport timestamps的某些内容。它似乎期望消息在分布式端点之间传输的时间相同。
假设流程p1
按顺序发送消息m1
和m2
以处理p2
。遵循本文算法部分中的伪代码,我们有:
# we start at 0
time(p1) = 0
# we send m1
time(p1) = time(p1) + 1 = 1
send(m1, 1)
# we send m2
time(p1) = time(p1) + 1 = 2
send(m2, 2)
如果m1
在p2
之前到达m2
,一切正常。但如果先m2
出现,我们会得到:
# we start at 0
time(p2) = 0
# we receive m2 first
time(p2) = max(2, time(p2)) + 1 = max(2, 0) + 1 = 3
# we receive m1 second
time(p2) = max(1, time(p2)) + 1 = max(1, 3) + 1 = 4
因此,在p2
的当地时间(time(p2)
)m2
的时间为3,m1
的时间为4.这与订单的顺序相反消息最初发送的位置。
我是否遗漏了一些基本内容或Lamport时间戳是否需要一致的旅行时间?
答案 0 :(得分:0)
消息的时间是消息中包含的时间,而不是接收消息的进程的时间。
定时器在两个进程之间进行逻辑共享,因此它需要对两个进程的事件(发送)进行计数,这就是接收器在接收到消息时添加一个进程的原因。
该算法试图维持这两个过程'定时器同步,即使消息丢失或延迟,这也是接收器最大限度地查看时间和发送者在消息中找到的时间视图的原因。如果这些不一样,则某些消息已丢失或延迟。这将导致两个进程具有不同的时间视图,但是当发送和接收下一个消息时(在任一方向上),时钟将被重新同步。
如果两个进程同时发送一条消息,则这两条消息将包含相同的时间,这就是为什么它不是一个总订单。但时钟仍将最终重新同步。