如何理解微服务架构中的事件溯源

本文翻译自 How To Understand Event Sourcing In Microservices Architecture,原文作者 OLEKSII。

问题描述

CQRS 模型的局限性实际在于只保存领域实体的最新状态。对于某些应用程序,这已经足够了。然而,其他系统需要更大的弹性。这可以通过事件溯源(Event Sourcing)实现。


事件溯源

事件溯源可以描述为一组以下的原则。

  • 事件溯源通常与 CQRS 结合使用。
  • 实体的所有更新操作都表现为命令。通常,这些命令与领域区域相关,对业务也有一定意义。
  • 每个命令都保存到追加事件日志中。因此,命令是不可变更的。这使审计功能开箱即用。
  • 服务订阅到事件日志,是为了处理事件并能提供一些业务价值。

事件溯源示例

让我们回顾一个例子。

这是一个 CQRS 模型(详情参阅文章 如何理解微服务体系结构中的 CQRS)。

假设我们只对电影评分功能感兴趣。用户以评分的形式(例如从 0 到 10)留下对电影的意见。这样:

用户在电影评价服务上启动添加评分命令。

电影评价服务找到指定的电影。它可以包含许多字段。然而,我们只对计算评分的字段感兴趣:电影投票总数和所有电影投票总数。

评分信息已更新。一个被添加到电影投票总数中。来自添加评分命令的新评分将添加到所有电影投票总数中。

完整的电影快照被发送到 Message Broker。

所有用户都可以通过电影汇总服务 查看更新的电影评分(所有电影投票总数除以电影投票总数)。

这种设计的问题在于,只保存了最新的评分状态。整个历史已经丢失了。

让我们回顾一个事件溯源模型。

此图几乎与上一个图一样。CQRS 模型也可以用在这里。

  • 用户在电影评分服务 上启动添加评分命令。
  • 事件还有以下信息:向电影《指环王》添加评分 8。
  • 电影评分服务 将此事件保存到事件日志中(例如 Kafka)。
  • 电影汇总服务 以前使用了其数据库中每部电影的电影投票总数和所有电影投票总数字段。
  • 电影汇总服务 处理事件日志中的记录并更新评分。
  • 所有用户都可以看到更新的电影评分(所有电影投票总数除以电影投票总数)。

乍一看,一切都没有改变。然而,它给系统带来了更多的弹性。

电影评分的问题在于人们有不同的口味。一般评分值(如 7.35)仅显示基于多人意见计算的平均分数。作为一家提供电影流媒体功能的公司,我们有意为用户提供良好的建议。我们如何才能做到这一点?为了简化逻辑,我们可以用一条语句来完成。推荐那些与该用户高度评价的电影类型相似的电影。

这样,引入了一种新的服务------电影推荐服务

我们正在扩展现有系统。因此,电影推荐服务 应该处理所有以前分配的评分。通过事件溯源,这是可能的,因为我们将此信息保存在 Kafka 中(电影《指环王》添加评分 8)。在第一个示例中,由于我们只存储了最后一个电影评分值,因此做不到。

事件溯源的优势

  • 关注点的分离。
  • 每个服务的缩放都是独立的。
  • 可以为每个服务选择合适的数据存储及其模式(schema)。
  • 所有服务中的简单高效的查询。
  • 新服务可以轻松添加到现有应用程序中。

事件溯源的劣势

  • 复杂性。
  • 最终一致性。
  • 新服务可能需要大量时间来处理已有事件。

总结

在本文中,我们回顾了事件溯源模式。它通常与 CQRS 搭配使用。值得一提的是,这种模式的必要性可能发生在复杂的系统中。因此,应谨慎选择,以免给系统带来不必要的复杂性。

相关推荐
虎子_layor1 分钟前
实现异步最常用的方式@Async,快速上手
后端·spring
一米阳光zw20 分钟前
Spring Boot中使用 MDC实现请求TraceId全链路透传
java·spring boot·后端·traceid·mdc
王元_SmallA34 分钟前
pgsql:connection failed connection to server at
java·后端
绝无仅有37 分钟前
大厂面试相关文章:深入技术面试中的核心知识点
后端·面试·架构
绝无仅有40 分钟前
面试文章:网络协议与redis安全,https协议,TCP三次握手,四次挥手等面试经典问题
后端·面试·架构
没有bug.的程序员1 小时前
Eureka 注册中心原理与服务注册发现机制
java·spring·云原生·eureka·架构·注册中心·服务注册发现
jzhwolp1 小时前
nginx epoll 里黑科技位运算+指针复用
linux·nginx·架构
IT_陈寒1 小时前
7个鲜为人知的JavaScript性能优化技巧,让你的网页加载速度提升50%
前端·人工智能·后端
几颗流星1 小时前
Rust 常用语法速记 - 迭代器
后端·rust
Ashlee_code1 小时前
经纪柜台系统解析:从今日国际金融动荡看证券交易核心引擎的变革
python·架构·系统架构·区块链·vim·柜台·香港券商