eBay 的持续交付团队通过使用以事件为中心的方法构建了一个可以持续交付的编配器,具备故障弹性和伸缩性,以便处理eBay 构建管道中不断增加的负载。John Long 和Nataraj Sundar 在两篇博文中描述了事件溯源的好处以及在实际应用程序开发当中所具备的优势。
Long 和 Sundar 都是 eBay 的员工,他们指出,事件溯源背后的想法在很多领域已经存在了很长一段时间。例如,在金融会计中,每个条目都以不可变的方式记录下来,并且通过相加所有相关条目来计算当前余额。当发生错误时,追加新的补偿条目,而不是擦除错误的条目。他们认为,事件溯源与开发管道中的代码进度有着天然的相识点。
企业持续交付(ECD)实现了事件溯源。这是一个编配器,用于协调、定义和观察部署管道,并被用在许多内部系统中。部署管道通过拉取请求、构建、测试和部署的方式来移动代码。管道执行服务(PES)是 ECD 的一个组件,一种运行和跟踪管道的服务,它负责将状态报告给 GitHub。这个组件使用 Scala 开发,并使用了 actor 模型框架 Akka 。
除了事件溯源的一般性好处之外,Long 和 Sundar 还指出了他们在 PES 中使用事件溯源的三个主要原因:
-
并发。在过去,同时从管道的不同部分收到的事件之间具有竟态条件,而以串行的方式处理每个事件可以更轻松地解决并发问题。
-
调试和可追溯性。由于他们是个小团队,同时要支持许多管道,因此能够快速找到故障原因并修复它们对他们来说至关重要。
-
清晰度和正确性。编配对于公司来说至关重要,并且可能会变得非常复杂,因此他们需要高质量和简单且易于理解的代码库。将代码拆分成几个部分,记录传入的信息,计算最终模型并对模型变化做出反应,这种方式可以帮助他们实现上述的目的。
选择事件溯源最大的原因是最后一点——清晰度和正确性。Long 和 Sundar 认为,对于涉及时间和状态的复杂系统,事件溯源是可行的解决方案。通过精心设计的模型,可以分别处理流程中的不同部分,从而使流程更易于理解。他们介绍了事件溯源的四个组件,每个组件都很容易理解,也很容易进行修改和测试。
-
验证传入事件,根据需要创建和存储相关内部事件。
-
按事件插入的顺序处理事件,并进行适当的视图模型更新。
-
在处理完事件之后持久化视图,这样在进行查询时就不需要加载和重放所有事件。
-
根据状态变更做出响应,并在读取模型发生更新时决定该做些什么,然后启动新 actor 来执行操作。
到目前为止,他们的系统已经处理了超过 220 万个事件,生成了大约 200,000 个运行视图。Long 和 Sundar 表示,事件溯源架构对于实现兼容和直观的解决方案来说至关重要。
查看英文原文: Continuous Delivery Implemented with Event Sourcing at eBay
评论