当前位置: 首页 > article >正文

分布式系统架构模式精讲:CQRS、Saga与数据库选型完全指南

摘要分布式系统设计是现代后端架构的核心挑战。本文深入讲解CQRS命令查询职责分离模式、Saga分布式事务模式、Event Sourcing事件溯源模式以及在CAP定理约束下的数据库选型策略。通过大量代码示例和对比表格帮助读者理解这些模式的设计原理、适用场景和实现细节掌握分布式系统设计的核心方法论。第一章 CQRS模式读写分离的架构艺术CQRSCommand Query Responsibility Segregation是一种将命令写操作和查询读操作分离的架构模式。传统CRUD模型中读写共用同一数据模型但在复杂业务场景下读写需求差异巨大分离后可以独立优化大幅提升系统性能和可维护性。1.1 CQRS的设计动机性能差异读操作通常远多于写操作且读操作需要复杂的查询和聚合写操作需要严格的业务规则验证。将两者分离后可以针对各自特点独立优化。复杂度差异写操作涉及复杂的业务逻辑、状态转换、并发控制读操作主要是数据组装和展示。分离后可以使用更适合的技术栈。扩展需求在高并发场景下读写分离可以实现独立扩容避免读压力影响写性能反之亦然。1.2 CQRS核心实现from dataclasses import dataclassfrom typing import List, Dictimport uuidfrom datetime import datetime# 领域事件 dataclassclass DomainEvent:event_id: strevent_type: straggregate_id: strdata: dicttimestamp: datetime# 命令定义 dataclassclass CreateOrderCommand:order_id: strcustomer_id: stritems: List[dict]dataclassclass AddItemCommand:order_id: strproduct_id: strquantity: intprice: float# 命令处理器 class OrderCommandHandler:def __init__(self, repository, event_bus, read_model):self.repository repositoryself.event_bus event_busself.read_model read_modeldef handle_create(self, cmd: CreateOrderCommand):# 业务验证if not cmd.items:raise ValueError(订单不能为空)# 创建聚合根order Order(idcmd.order_id,customer_idcmd.customer_id,statuspending,itemscmd.items)# 持久化写模型self.repository.save(order)# 发布领域事件event DomainEvent(event_idstr(uuid.uuid4()),event_typeOrderCreated,aggregate_idorder.id,data{customer_id: order.customer_id, items: order.items},timestampdatetime.now())self.event_bus.publish(event)# 同步更新读模型self.read_model.update_order_summary(order.id, {customer_id: order.customer_id,status: order.status,item_count: len(order.items),total: sum(item[price] * item[quantity] for item in order.items)})# 查询服务 class OrderQueryService:def __init__(self, read_db):self.read_db read_dbdef get_order_summary(self, order_id: str):# 直接查询优化的读模型return self.read_db.query(SELECT * FROM order_summary WHERE id ?,order_id)def get_customer_orders(self, customer_id: str, page: int, size: int):# 分页查询使用索引优化return self.read_db.query(SELECT * FROM order_summary WHERE customer_id ? ORDER BY created_at DESC LIMIT ? OFFSET ?,customer_id, size, (page - 1) * size)1.3 CQRS的优缺点分析维度优点缺点性能读写独立优化数据同步延迟扩展性独立扩容系统复杂度增加维护性关注点分离需要处理最终一致性技术栈灵活选型运维成本增加第二章 Saga模式分布式事务的优雅方案在微服务架构中传统ACID事务难以跨服务边界。Saga模式将长事务分解为多个本地事务每个本地事务更新一个服务的数据库并通过消息传递触发下一步操作。如果某个步骤失败执行补偿事务回滚已完成的操作。2.1 Saga的两种实现方式编排式中央协调器负责调度整个流程。优点是流程清晰、易于理解和调试适合简单业务流程。缺点是协调器成为单点所有服务都需要与协调器交互。协同式各服务通过事件订阅方式协作没有中心节点。优点是去中心化、扩展性好适合复杂分布式场景。缺点是流程分散、难以追踪和调试。实现方式优点缺点复杂度适用场景编排式流程清晰、易于调试协调器单点中简单业务流程协同式去中心化、扩展性好流程分散、难追踪高复杂分布式场景2.2 Saga编排器实现from abc import ABC, abstractmethodfrom typing import List, Tuple, Callable, Anyimport asyncioclass SagaStep:def __init__(self, name: str, action: Callable, compensate: Callable):self.name nameself.action actionself.compensate compensateclass SagaOrchestrator:def __init__(self, steps: List[SagaStep]):self.steps stepsself.completed_steps []self.status pendingasync def execute(self):# 顺序执行各步骤for step in self.steps:try:await step.action()self.completed_steps.append(step)self.status runningexcept Exception as e:# 失败时执行补偿await self.compensate()self.status compensatedraise SagaError(fStep {step.name} failed: {e})self.status completedreturn self.statusasync def compensate(self):# 逆序执行补偿for step in reversed(self.completed_steps):try:await step.compensate()except Exception as e:# 补偿失败记录日志并继续print(fCompensation failed for {step.name}: {e})# 使用示例订单处理Sagaasync def create_order(): ...async def cancel_order(): ...async def reserve_inventory(): ...async def release_inventory(): ...async def process_payment(): ...async def refund_payment(): ...order_saga SagaOrchestrator([SagaStep(create_order, create_order, cancel_order),SagaStep(reserve_inventory, reserve_inventory, release_inventory),SagaStep(process_payment, process_payment, refund_payment)])await order_saga.execute()第三章 Event Sourcing事件即真相Event Sourcing是一种数据持久化模式不存储当前状态而是存储导致当前状态的所有事件。当前状态通过回放事件重建。这种模式提供了完整的审计轨迹、时间旅行能力并与CQRS天然契合。3.1 Event Sourcing核心实现class EventStore:def __init__(self, db):self.db dbdef append(self, aggregate_id: str, events: List[DomainEvent]):# 原子性追加事件带版本号防止并发冲突for i, event in enumerate(events):self.db.execute(INSERT INTO events (id, type, aggregate_id, data, version, timestamp) VALUES (?,?,?,?,?,?),event.event_id, event.event_type, aggregate_id,json.dumps(event.data), event.version, event.timestamp)def get_events(self, aggregate_id: str, from_version: int 0):return self.db.query(SELECT * FROM events WHERE aggregate_id ? AND version ? ORDER BY version,aggregate_id, from_version)class BankAccount:def __init__(self, account_id: str):self.account_id account_idself.balance 0self.version 0def apply(self, event: DomainEvent):# 应用事件重建状态if event.event_type AccountOpened:self.balance 0elif event.event_type MoneyDeposited:self.balance event.data[amount]elif event.event_type MoneyWithdrawn:self.balance - event.data[amount]self.version event.versionclassmethoddef from_events(cls, account_id: str, events: List[DomainEvent]):account cls(account_id)for event in events:account.apply(event)return account第四章 CAP定理与系统取舍CAP定理指出在分布式系统中一致性、可用性、分区容错性三者最多只能同时满足两个。由于分区容错性是分布式系统的必要条件实际取舍在于一致性与可用性之间。系统类型一致性可用性典型产品适用场景CA强一致性高可用性单机MySQL传统单体应用CP强一致性牺牲可用性HBase、Zookeeper金融交易、配置管理AP最终一致性高可用性Cassandra、DynamoDB社交、日志、缓存第五章 数据库选型决策矩阵现代应用通常需要多种数据库配合使用。以下是按数据特征和访问模式选型的决策框架数据特征推荐类型具体产品核心优势结构化事务关系型PostgreSQL、MySQLACID、SQL成熟文档灵活Schema文档型MongoDB、 CouchDBSchema灵活、易扩展时序高写入时序型InfluxDB、TimescaleDB高效压缩、时间查询关联图遍历图数据库Neo4j、Nebula路径查询高效向量相似度向量型Milvus、PineconeANN检索快速第六章 实战电商订单系统架构以电商订单系统为例综合应用CQRS、Saga、Event Sourcing等模式写模型Order聚合根、Event Sourcing持久化、发布领域事件读模型Elasticsearch全文搜索、Redis热点缓存、数据仓库BI分析分布式事务Saga编排订单创建、库存预留、支付处理、物流通知数据库选型PostgreSQL订单主数据强一致性、MongoDB商品详情灵活Schema、Redis购物车高性能、Elasticsearch商品搜索全文检索

相关文章:

分布式系统架构模式精讲:CQRS、Saga与数据库选型完全指南

摘要分布式系统设计是现代后端架构的核心挑战。本文深入讲解CQRS命令查询职责分离模式、Saga分布式事务模式、Event Sourcing事件溯源模式,以及在CAP定理约束下的数据库选型策略。通过大量代码示例和对比表格,帮助读者理解这些模式的设计原理、适用场景和…...

5分钟免费解锁Cursor AI Pro完整功能:开发者必备的高效解决方案

5分钟免费解锁Cursor AI Pro完整功能:开发者必备的高效解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached…...

B站视频下载神器:轻松保存4K高清视频的完整指南

B站视频下载神器:轻松保存4K高清视频的完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾遇到过这样的情况…...

花了钱心里没底?三步教你验证APK加固后的真实防护效果

签了合同,集成了SDK,APK也加固好了。但你真的放心吗?很多开发者在选择APK加固方案服务商后,最大的困惑就是:“我不知道它到底有没有用。” 对方说防住了,怎么证明?万一哪天被破解了,…...

DDL急救包!2026论文降AI率实测:10款润色工具稳保安全区

现在写论文最怕的,已经不是查重了。怕什么?怕那个AIGC率太高。 真的,越来越多学校开始抓AIGC检测报告了,重复率放一边,就看你AI痕迹多不多。我自己就是刚爬出坑的25届学姐,这坑我踩得死死的。怎么说呢&…...

应对2026检测新规:论文如何优化?实测10款降低AI率工具,SCI/工科适用

现在写论文最怕的,已经不是查重了。怕什么?怕那个AIGC率太高。 真的,越来越多学校开始抓AIGC检测报告了,重复率放一边,就看你AI痕迹多不多。我自己就是刚爬出坑的25届学姐,这坑我踩得死死的。怎么说呢&…...

2026论文润色避坑指南:免费降AI率工具靠谱吗?深度横评10款软件+排雷名单

现在写论文最怕的,已经不是查重了。怕什么?怕那个AIGC率太高。 真的,越来越多学校开始抓AIGC检测报告了,重复率放一边,就看你AI痕迹多不多。我自己就是刚爬出坑的25届学姐,这坑我踩得死死的。怎么说呢&…...

【2026最新】排版全乱?实测10款论文降AI率神器,这款能完美保留格式!

现在写论文最怕的,已经不是查重了。怕什么?怕那个AIGC率太高。 真的,越来越多学校开始抓AIGC检测报告了,重复率放一边,就看你AI痕迹多不多。我自己就是刚爬出坑的25届学姐,这坑我踩得死死的。怎么说呢&…...

Kompute安全编程:保护GPU计算免受恶意攻击的7个防护措施

Kompute安全编程:保护GPU计算免受恶意攻击的7个防护措施 【免费下载链接】kompute General purpose GPU compute framework built on Vulkan to support 1000s of cross vendor graphics cards (AMD, Qualcomm, NVIDIA & friends). Blazing fast, mobile-enable…...

跨越数据洪流:异步FIFO芯片IDT7204/7205在高速数据缓冲中的实战解析

1. 异步FIFO芯片:数据洪流中的"智能水坝" 想象一下这样的场景:你正在用高速摄像机拍摄一场赛车比赛,每秒产生数百MB的图像数据,但后端处理器受限于算法复杂度,只能以每秒50MB的速度处理。这时候数据就像决堤…...

智能编码已死?不,是“不可见”的代码生成正在杀死交付质量——可视化溯源体系构建指南(含GitHub Star 4.2k的vscode插件深度配置)

第一章:智能编码已死?不,是“不可见”的代码生成正在杀死交付质量——可视化溯源体系构建指南(含GitHub Star 4.2k的vscode插件深度配置) 2026奇点智能技术大会(https://ml-summit.org) 当Copilot、CodeWhisperer与C…...

mysql如何实现数据库降序输出_使用order by字段desc语句

ORDER BY 字段 DESC 未生效最可能因无索引导致优化器跳过排序,或子查询/视图中排序被忽略;复合索引需方向匹配,字符串排序受collation影响,时间字段降序分页用OFFSET性能差。ORDER BY 字段 DESC 为什么没生效常见现象是写了 ORDER…...

打卡信奥刷题(3124)用C++实现信奥题 P7411 [USACO21FEB] Comfortable Cows S

P7411 [USACO21FEB] Comfortable Cows S 题目描述 Farmer Nhoj 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。初始时,草地上是空的。 Farmer Nhoj 将会逐一地将 NNN(1≤N≤1051\le N\le 10^51≤…...

如何快速清理Windows系统:Win11Debloat完整优化指南

如何快速清理Windows系统:Win11Debloat完整优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cust…...

如何用Bili2text实现一键视频转文字:从B站链接到文字稿的完整指南

如何用Bili2text实现一键视频转文字:从B站链接到文字稿的完整指南 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text Bili2text是一个专为B站用户设计…...

golang如何实现设备数据采集网关_golang设备数据采集网关实现要点

不能直接用 httputil.NewSingleHostReverseProxy 做设备数据采集网关,因其仅为 HTTP 请求-响应设计,缺乏设备连接管理、多协议支持、独立超时控制及断线恢复能力。用 httputil.NewSingleHostReverseProxy 直接做设备数据采集网关,90% 的情况会…...

fre:ac音频转换器终极指南:如何在5分钟内完成无损格式转换

fre:ac音频转换器终极指南:如何在5分钟内完成无损格式转换 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 还在为不同设备间的音频格式兼容性问题而烦恼吗?fre:ac音频转换器为你…...

3分钟完成系统优化:Winhance让你的Windows电脑重获新生

3分钟完成系统优化:Winhance让你的Windows电脑重获新生 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-z…...

QMCDecode技术解析:QQ音乐加密音频格式解密实现原理

QMCDecode技术解析:QQ音乐加密音频格式解密实现原理 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换…...

AD22更新网表时总是显示 net with name XXX In already exists

目录 常规检查 系统性问题排查流程 其他原因导致的问题 常规检查 检查并修正原理图 查找重复网络标签在原理图中,使用查找功能全局搜索CMD_In,检查是否存在多个同名的网络标签(Net Label)。如果发现重复,需要删除多余的并确保所有连接到该网络的导线正确连接。 重新放置…...

如何解决ScriptCat中GM.xmlHttpRequest异步兼容性问题:完整指南

如何解决ScriptCat中GM.xmlHttpRequest异步兼容性问题:完整指南 【免费下载链接】scriptcat ScriptCat, a browser extension that can execute userscript; 脚本猫,一个可以执行用户脚本的浏览器扩展 项目地址: https://gitcode.com/gh_mirrors/sc/sc…...

五分钟轻松掌握 Python 自动化测试 Selenium

一、Selenium selenium 是一个老牌的测试工具和自动化工具,它的用途非常多,掌握这么技能绝对是值得,并且如果有需要切换其他的技术,大致应该是相似的,也就是说从它迁移到别的工具是轻松的。 二、为什么 Selenium 需要…...

用STM32F103和DS1302做个多功能电子钟:从Proteus 8.11仿真到代码烧录全流程

STM32F103与DS1302电子钟实战:从仿真到硬件的全流程解析 在嵌入式开发领域,电子时钟项目堪称"Hello World"级别的经典案例。不同于简单的LED闪烁,它融合了实时时钟芯片驱动、人机交互界面设计、多任务状态机管理等核心技术要点。本…...

02华夏之光永存:黄大年茶思屋榜文解法「第7期2题」大规模光网络多约束寻路算法·双路径解法

华夏之光永存:黄大年茶思屋榜文解法「第7期2题」 大规模光网络多约束寻路算法双路径解法(约束内最优本源降维) 一、摘要 本题为全光算力网络路由调度领域顶级技术难题,本文采用工程化可复现逻辑,提供两条标准化解题路径…...

避开VisionPro TCP通讯的那些坑:从配置到代码的完整避坑指南

VisionPro TCP通讯实战避坑指南:从配置陷阱到代码优化的全链路解决方案 第一次尝试将VisionPro的检测数据通过TCP/IP传输到外部程序时,我踩遍了所有能想到的坑——从莫名其妙的连接失败,到接收到的数据乱码,再到程序突然卡死。如果…...

告别盲目调管子!用gm/ID方法在Cadence Virtuoso里搞定模拟IC设计(附SMIC 13nm工艺库仿真脚本)

用gm/ID方法在Cadence Virtuoso中实现精准模拟IC设计 当你在SMIC 13nm工艺下设计一个运算放大器时,是否经历过这样的困境:按照教科书上的平方律公式计算出的晶体管尺寸,在实际仿真中完全达不到预期性能?或者为了满足增益和带宽要求…...

01华夏之光永存:黄大年茶思屋榜文解法「第7期1题」OXC超快速切波技术·双路径解法

华夏之光永存:黄大年茶思屋榜文解法「第7期1题」 OXC超快速切波技术双路径解法(约束内最优本源降维) 一、摘要 本题为全光传送领域世界级底层技术难题,本文采用工程化可复现逻辑,提供两条标准化解题路径,全…...

别再只用命令流了!用Workbench表格功能动态控制ANSYS流体渗透压力阈值

突破传统:用Workbench表格功能实现流体渗透压力的智能动态控制 在ANSYS仿真领域,命令流操作一直是许多工程师的"舒适区"。但当我们面对复杂的多物理场耦合问题时,仅靠静态参数设置往往难以捕捉真实工况中的非线性特性。以刹车系统仿…...

STM32LL库实战入门:从零搭建高效开发环境

1. 为什么选择STM32 LL库开发? 第一次接触STM32 LL库的开发者可能会有疑问:已经有了HAL库和标准库,为什么还要学习LL库?这个问题要从嵌入式开发的效率需求说起。我在实际项目中遇到过这样的情况:使用STM32F030芯片做电…...

构建网页内容相似度搜索引擎:gumbo-parser HTML5解析库终极指南

构建网页内容相似度搜索引擎:gumbo-parser HTML5解析库终极指南 【免费下载链接】gumbo-parser An HTML5 parsing library in pure C99 项目地址: https://gitcode.com/gh_mirrors/gum/gumbo-parser gumbo-parser是一个用纯C99编写的HTML5解析库,…...