分布式系统中按是否存在节点交互可分为三类事件,一类发生于节点内部,二是发送事件,三是接收事件。注意: 以下文章中提及的时间戳如无特别说明,都指的是Lamport 逻辑时钟的时间戳,不是物理时钟的时间戳。
如果a在进程Pi中,b在进程Pj中,Ci(a) = Cj(b)且i < j,那么a在b之前。形式化一点,我们可以把系统事件E上的全序关系“=>”定义为:
假设a是Pi中的事件,b是Pj中的事件,那么:a => b当且仅当以下两个条件之一成立:
1. Ci(a) < Cj(b);
2. Ci(a) = Cj(b) 且 i < j;
Lamport 逻辑时钟原理如下:
- 每个事件对应一个Lamport时间戳,初始值为0;
- 如果事件在节点内发生,本地进程中的时间戳加1;
- 如果事件属于发送事件,本地进程中的时间戳加1并在消息中带上该时间戳;
- 如果事件属于接收事件,本地进程中的时间戳 = Max(本地时间戳,消息中的时间戳) + 1。