如何理解微服务体系结构中的 CQRS

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

问题描述

在典型的软件应用程序中,有一个负责写入和读取操作的数据存储。通常,应用程序实现一些 CRUD 操作,并且非常简单。你存储了一些东西并读取了相同的结果。

然而,在复杂的应用程序中,情况并不是那么简单。每个读和写操作都需要很多操作和约束。

例如:

  • 写:数据库是以规范化的方式构造的,以消除数据重复并强制约束。读:复杂的读取查询需要大量对性能产生负面影响的联接(joins)/联合(unions)/聚合(aggregations)。
  • 读:优化查询需要索引。写:每次写操作都会更新索引。
  • 读/写表示可能不同,这可能是附加逻辑的原因。
  • 在对同一数据进行并行操作期间,可能会发生数据争用。
  • 由于数据库的负载,性能可能很差。

CQRS

上述问题的解决方案是 CQRS(Command Query Responsibility Segregation)。

让我们回顾一下上面的图片。它包含两个服务:旅馆管理服务 和旅馆预订服务 (实际上,如果需要的话,可以有多个不同的预定服务及其各自的数据库)。这些服务之间的数据应该同步。为此,通常使用一些消息代理(例如 Kafka。这些服务的数据格式不同。

旅馆管理服务 负责创建/更新/删除操作,每个操作都被描述为一个命令:

  • 生成/批准/拒绝一个酒店创建请求。
  • 添加/更新酒店房间到系统。
  • 更改酒店房间的价格。
  • 预订特定时间段的酒店房间。
  • 请求其他服务。
  • 生成请求留下/批准/拒绝评论。
  • 取消预订。

旅馆预订服务仅负责向用户显示酒店/房间列表:

  • 列出一个城市中所有/可用的酒店房间。
  • 在地图上显示所有酒店(按地理位置过滤)。
  • 向用户显示可用的过滤选项。
  • 通过指定的过滤器过滤酒店房间(例如,显示两个酒店房间,而不是一个多人房间)。

正如你所见,服务提供的责任是不同的。此外,指定服务的性能约束也不同。用户在预订之前通常会经过许多预订选项。因此,在这个系统中,读操作的数量远远高于写操作的数量。因此,这些服务的缩放将有所不同。

因此,一些 RDBMS 可以用作旅馆管理服务的数据存储,例如 MySQL或 PosgreSQL。RDBMS 将为保持数据安全提供它的所有好处。

旅馆预订服务可以基于一些 NoSQL 解决方案,如 MongoDB或 Elasticsearch。这背后的原因是执行高效搜索查询的能力:反规范化、地理位置搜索支持、索引、水平缩放等。

CQRS 优势

  • 关注点分离。
  • 单个读写服务缩放。
  • 适合读写操作的数据存储及其模式(schema)。
  • 简单高效的查询。

CQRS 劣势

  • 复杂性。
  • 最终一致性。

总结

在本文中,我们回顾了 CQRS 模式。值得一提的是,这种模式的必要性可能发生在复杂的系统中。因此,应谨慎选择,以免给系统带来不必要的复杂性。


相关推荐
PingCAP11 分钟前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
lazy H18 分钟前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我1234525 分钟前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法
Bazingga31 分钟前
RAG路由全景:一个问题走到岔路口,谁来指路
后端
云边有个稻草人33 分钟前
从日志到落库:数据集成产品 KFS 如何打通异构数据库实时同步链路
后端
天远Date Lab39 分钟前
零信任架构实战:基于天远柠檬查维保构建自动化全国连锁二手车置换上架电子维保报告网关
运维·人工智能·架构·自动化
努力小陈139 分钟前
从 Java 到 Go:后端工程师的 30 分钟语法速查
后端
Thneonl39 分钟前
一个 502,十种病因:nginx 反代排障分诊树
后端·架构
花间相见41 分钟前
【计算基础|MySQL09】索引(下):失效与设计
数据库·后端·面试
南丘山1 小时前
接口自动化测试从零搭:31 条用例跑 4 秒,抓出 6 个权限缺陷
后端