不可靠世界的事件溯源

2017-12-07 17:49

不可靠世界的事件溯源

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的。

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)关注我们。

评价本文

专业度

风格

相关主题:

相关内容

相关厂商内容

您好,朋友! 您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

上一篇:店子镇中学举办防艾专题讲座 四百余师生参加
下一篇:宝东镇开展学习宣传贯彻党的十九大精神专题辅导
相关文章