我们有微服务,每个服务都生成由事件采购存储库存储的事件。我们使用Cassandra来存储事件数据。
您可能知道,事件的顺序很重要。
当我们从不同机器中运行的不同服务生成这些事件时,如何管理跨越这些事件的时间(时间戳)不同步,从而导致事件顺序不匹配。
答案 0 :(得分:5)
您可能知道,事件的顺序很重要。
在某些情况下 - 但是你要注意不要混淆时间,秩序和相关性。
当我们从不同机器中运行的不同服务生成这些事件时,如何管理跨越这些事件的时间(时间戳)不同步,从而导致事件顺序不匹配。
放弃有一个"命令"发生在不同地方的事件。 There is no now
商业界race conditions的Udi Dahan:
时间上的微秒差异不应对核心业务行为产生影响。
如果您的微服务边界是正确的,那么几乎同时在两个不同服务中发生的事件是一致的 - 它们没有正确排序,因为(为了类比)它们是不同的灯锥。唯一真实存在的排序是在单个聚合事件历史中。
真正意义上的是跟踪因果关系;本书记录中的这些变化是对该记录簿中这些变化的反应。
一种简单的形式就是跟踪happens-before,这就是vector clocks之类的想法开始出现的地方。
在我看过的大多数讨论中,这些信息将作为记录事件的元数据传递。
答案 1 :(得分:1)
这通常是通过vector clocks:
完成的矢量时钟是一种用于在分布式系统中生成事件的部分排序并检测因果关系违规的算法。
答案 2 :(得分:0)
如果我正确理解了您的问题,则您正在尝试保护写入,即确保在进行另一次写入之前确保微服务实例与所有相关事件都是最新的。
在这种情况下,请看一下lightweight transactions,它可以用于在Cassandra中实现optimistic locking。
This talk by Christopher Batey是一个很好的开始。