CQRS 微服务模式
优化查询以降低微服务应用的成本
什么是 CQRS?
命令查询职责分离 (CQRS) 是微服务架构中的一种模式,它将读取(查询)与写入(命令)解耦。这使得应用能够优化对较慢的基于磁盘的 SQL 数据库的写入操作,同时利用 Redis Enterprise 集成的变更数据捕获 (CDC) 功能预取和缓存数据,以实现读取优化查询。这样做可以使数据与其他微服务共享,而不会破坏隔离并耦合它们的部署。
什么是微服务中的 CQRS 模式?
CQRS 是一种微服务设计模式,它分离数据存储的读取和更新操作,以优化其性能、可伸缩性和安全性。
在支付应用中的工作原理
- 数据被写入微服务子域(支付审批)内的记录系统数据库。
- 数据从记录系统预取到 Redis Enterprise 缓存中。缓存使用自己的数据模式,该模式针对查询进行了优化,并且可以对搜索执行动态索引。
- 另一个微服务(支付历史)直接从缓存读取数据,与记录系统命令(写入)数据库没有耦合。
- Redis 集成的变更数据捕获 (CDC) 功能跟踪命令数据库事务日志中的更新,将行级变更数据转换为读取优化的 Redis 数据结构或模型,并以近实时方式将更新复制到查询数据库。
何时使用 CQRS 模式
- 需要由不同的服务查询一个域的数据,而无需创建依赖关系。
- 命令数据库具有复杂的业务逻辑,必须持久化数据以供长期记录,但读取微服务只需要查询数据。
- 服务的读取次数远多于写入次数。
- 读取性能和可伸缩性是关键需求。
- 读取数据存储以近实时方式根据写入数据库中的更改进行更新(最终一致性)。
解决您的挑战
问题 | Redis Enterprise 解决方案 |
---|
跨域访问数据会创建过多的依赖关系 | 通过创建独立的只读缓存为不同的服务提供数据,从而保持微服务之间的隔离。
分离读取和写入数据存储,以创建可维护和灵活的应用模型。 |
无法同时优化写入(持久性和一致性)和读取(实时查询) | 为查询缓存使用简单的读取优化模式;为需要持久更新和复杂业务逻辑的记录系统采用写入优化模式。
存储数据的物化视图,以避免在数据访问期间进行复杂的联接或映射。 |
过多的读取会导致性能损失和更高的基础设施成本 | 通过将读取处理卸载到缓存来最小化基础设施需求和大型机 MIPS,从而实现快速查询并减轻记录系统的负担。
依赖 Redis Enterprise 对多种数据结构的支持,轻松扩展以实现每秒数百万次操作吞吐量和 <1ms 延迟。 |
开发数据同步代码会增加复杂性和运营成本 | 为什么要自己构建?使用 Redis Enterprise 集成的 CDC,而不是实现单独的同步解决方案并产生相关的成本。 |
实现 CQRS 模式的优势
- 重复查询的读取性能得到改善。
- 写入和读取操作的独立扩展和优化。
- 在统一数据平台上支持多种数据结构和模型。
- 减轻命令数据库(记录系统)的负担,节省基础设施成本。
- 由于部署 Redis Enterprise 缓存和集成 CDC 功能的简便性,减少了开发人员资源。
了解更多
常见问题
- 什么是微服务域?
- 通常在微服务架构中,领域驱动设计 (DDD) 将应用的业务功能称为域。一个域由多个子域组成,每个子域对应业务的不同部分。例如,在零售电商网站域中,可能包含多个子域,包括产品目录、购物车、结账、库存和订单管理等。
- CQRS 模式与传统的基于 CRUD 的架构有何不同?
- CRUD 代表 Create(创建)、Read(读取)、Update(更新)和 Delete(删除),是传统应用数据操作中最常见的模式。它对读取和写入操作使用相同的数据存储和模型,而命令查询职责分离 (CQRS) 则分离了读取和写入数据模型。CRUD 设计的主要优点之一是其简单性,您可以对所有功能使用同一组类。对于使用简单业务逻辑的应用,例如用于管理注册、存储用户列表、更新用户信息和删除用户的用户注册应用,CRUD 是最佳选择。然而,随着应用变得越来越复杂,比如在金融服务应用中涉及支付、欺诈检测、结算和合规等领域,使用包含几十个甚至几百个服务、每个服务都有不同数据库和访问需求的微服务架构,CQRS 模式在这种场景下可能更适合。
- 什么是 CDC?
- 变更数据捕获 (CDC) 指跟踪数据源中的所有变更,以便将其复制和同步到目标系统。CDC 确保跨域和跨服务的数据完整性和一致性。
- CQRS 的优势和劣势是什么?
- 使用 CQRS 设计模式的主要优势之一是它提供了更好的可伸缩性和性能。由于读取和写入操作是分离的,因此可以独立优化它们,从而使读取操作的响应时间更快。然而,CQRS 模式也会增加应用的复杂性。开发人员需要仔细维护读取和写入模型之间的一致性,而额外的复杂性可能会使应用更难以维护。
- 事件溯源和 CQRS 如何协同工作?
- 事件溯源是一种技术,可以将应用状态的每次更改捕获为一系列事件。事件溯源不是存储应用的当前状态,而是存储导致当前状态的所有事件的历史记录。这意味着在任何时间点,您都可以通过重放导致当前状态的事件来重建应用的状态。事件溯源可以与 CQRS 结合使用,以提供一种可伸缩且高效的方式来分离读取和写入数据模型,从而优化特定微服务的性能。当您将事件溯源与 CQRS 结合使用时,写入模型可以使用像 Redis Streams 这样的事件存储来捕获数据更新。然后,读取模型使用此更新事件流来维护最终一致性,从而更容易将读取模型与写入模型独立地进行扩展。另一种选择是使用变更数据捕获解决方案,例如 Oracle Goldengate、Kafka Connect 或 Redis Enterprise 集成的 CDC 功能,这些解决方案针对此用例而设计,具有连接到不同数据库供应商的多个源连接器和目标连接器。
- CQRS 与 DDD 的集成是什么?
- CQRS 可以与领域驱动设计 (DDD) 集成,DDD 是一种专注于业务领域及其流程的软件开发方法。CQRS 和 DDD 之间的协同作用创建了一种强大的组合,可以实现高效且可伸缩的软件开发。CQRS 还实现了更好的关注点分离。领域模型可以专注于业务逻辑,而读取模型可以专注于查询和报告。这种分离使得应用更容易理解和维护。在 DDD 中使用 CQRS 的另一个优势是它简化了测试和调试。由于读取和写入操作是分离的,因此可以独立测试它们,从而更容易隔离和修复问题。