11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

不可靠世界的事件溯源

  • 2017-12-04
  • 本文字数:1144 字

    阅读完需:约 4 分钟

Lorenzo Nicora 在最近的µCon London2017 微服务讨论会上说明道:事件溯源系统的例子通常来自像电子商务这样的领域,这些领域生成事件的指令输入是面向过程的,同时这样的例子也常见于我们能够控制过程的地方。但有些领域是没有过程的,属于我们搜集外部事件的领域。这些领域的事件源本身就不可靠,传输也不可靠。这些领域涵盖物流运输领域、物联网领域以及依赖于不可靠网络、可能会暂时性中断的移动App 领域。

Buildit@wipro digital 的平台工程师 Niraco 指出,在这些不可靠的领域,事件发生在不可控的外部世界,这种情况下事件可能会丢失或者无序地到达。我们只需要在事件到达的时候将它们搜集起来,然后试着画出一个好理解的外部世界图。从本质上讲,我们必须放弃在面向过程的领域中所看到的命令和事件之间的区别,并开始接收所有传入的事件,同时尽可能快地验证存储它们,然后应用逻辑来建立读取模型。Nicora 认为这种思维转换与数据存储世界中从 ACID 到 BASE 的思维转换是一样的,他称这种方法为:

先快速写入,后思考。(Write Fast, Think Later.)

在这种场景中,事件的验证主要是安全检查,以防止系统出现伪造或恶意的事件,而且这个验证是完全无状态的。 因此,事件的验证和存储可以并行运行,这从可伸缩性的角度来看是很棒的。通过使用微服务架构,单独的服务可以处理事件的写入,构建读取模型并提供查询服务,为我们提供了一种很好的可伸缩的解决方案,因为每个服务都是独立可伸缩的。

在这些不可靠的领域存储所有事件有以下几个优点:

  • 如果事件延迟或者无序到达的话,记录事件。
  • 预测丢失的事件。
  • 如果发现模型中有不一致的地方或者收到了延迟事件的话,重构读取模型。
  • 延迟读取模型,让事件有时间到达。

在给事件排序的时候,一个事件唯一有意义的时间戳是它在源中创建的时间。问题是,这个时间戳仅仅在每个设备发射事件的时间点具有可靠性,这意味着我们无法给全部事件做可靠的排序,而且要解决这个问题并不容易。 如果来自不同设备的事件之间的排序很重要,那么在事件存储好之后,我们必须在逻辑上处理这些事件。 Nicora 还提到,使用这种设计的话,读取模型将总是被延迟,延迟时间长短取决于领域和实现难度。

Nicora 最后指出,如果你在一个不可靠的世界中做事件溯源,同时又需要很高的可伸缩性,那么这个弱写一致性模型可能是一个很好的选择。 他强调说,在使用这个模型的时候,我们没必要确保事件写入的一致性,相反地,我们应该专注于构建一致的读取模型。

明年的会议将会在2018 年11 月5 日至6 日举办。

查看英文原文: Event Sourcing in an Unreliable World


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-12-04 18:001186
用户头像

发布了 21 篇内容, 共 12.1 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容
不可靠世界的事件溯源_语言 & 开发_Jan Stenberg_InfoQ精选文章