分布式系统:保持不同节点之间的时间戳一致性

时间:2013-11-23 09:21:25

标签: events timestamp distributed-system

上下文

我们有一个分配系统。我们从其中一个系统发出事件,这些系统从另一个系统读取以生成报告。

逻辑顺序由以下事实确保:即使发射器系统具有N个节点,也存在下划线的有限状态机,这使得不可能同时发射一个聚合的事件。 这些事件标有时间戳。 N个节点不能总是在时间上同步。

我们非常关心时间戳,因为生成报告的下游系统总是需要时间戳,因为"报告人员"关心这种数据以检查事情是否正确。

问题

事实上2个节点可能会有一点差异,这让我们思考。让我们想象下一个例子。

事件的逻辑顺序是:

事件1 =>事件2 =>活动3

但是在数据库中我们可能会遇到这种情况:

-------------------------------------------
|  Name   |  TimeStamp  |  Logical Order  |
-------------------------------------------
| Event 1 |      2      |        1        |
| Event 2 |      1      |        2        |
| Event 3 |      3      |        3        |
-------------------------------------------

您是否可以看到事件2 事件1 之后逻辑上发生但是他们的时间戳无法同步。

好的,这不会每2秒发生一次,但可能会发生,因为时间戳来自不同的节点。从报告的角度来看,这是一个异常现象。

可能的解决方案

  1. 让报告人员意识到可能存在的问题。我们无法拥有一个全球时间源(由于某些原因,NTP不是一个好的解决方案)所以如果有很短的时间差异不是问题,这意味着"这个事件是发生在那个时间周围"。
  2. 确保时间戳一致性检查逻辑流中的下一个事件的时间戳不能小于上一个使它们等于的事件的时间戳。这不是事实,但即使从非开发人员的角度来看,也保持流程一致。
  3. 你有关于这个主题的经验吗?

2 个答案:

答案 0 :(得分:2)

如果您可以确保因果关系并且具有部分订单,那么在使用修改后的时间戳呈现“有用的业务表示”时我不会发现很多问题。我认为底层分布式架构已经脱离了业务领域的背景。

他们可能从整体上理解这个系统,强迫他们的心理模型转变可能会引起一些摩擦。

另一方面,我不会对日志中的时间戳进行标准化,您可以使用它来跟踪子系统之间的时钟漂移。

答案 1 :(得分:1)

根据您的问题,我假设在有限状态机读取事件之前生成时间戳。我建议您按时间戳排序事件,而不是使用logical order。在分布式系统上工作时,建议使用一种方法对事件进行排序。

关于分布式,顺序ID生成,我建议您查看前一个链接中提到的answersnowflake。后者提供了一个分布式服务,您可以将其用作集中式标记生成器。雪花生成的ID由以下组成:时间戳,工号和序列号。

TL; DR

如果时间戳足够可靠以保证事件顺序,我建议您使用那个而不是logical order,我假设它是在时间戳之后生成的。

锄头有帮助