DotNetCore.Cap分布式事务实现最终一致性
项目演化过程中,微服务已经遍地开花。一个大项目下几十上百个微服务已经是常态。但衍生出另外一个问题就是跨微服务事务,跨库事务的分布式事务。市面了解过的有2CP、3CP、TCC等等分布式事务解决方案,各有优缺。对目前公司业务不太理想,DotNetCore.CAP的出现是从事.net开发者的福音。呵呵...
CAP概述
CAP 是一个事件总线EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。
CAP 采用模块化设计,具有高度的可扩展性。你有许多选项可以选择,包括消息队列,存储,序列化方式等,系统的许多元素内容可以替换为自定义实现。在 CAP 内部会将消息进行存储,以保证消息的可靠性,并配合重试等策略以达到各个服务之间的数据最终一致性。
什么是 EventBus?
事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。 组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。 组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。 这样,组件可以相互通信而无需相互依赖。 同样,很容易替换一个组件。 只要新组件了解正在发送和接收的事件,其他组件就永远不会知道.
架构预览
CAP 支持以下几种运输方式
- RabbitMQ
- Kafka
- Azure Service Bus
- Amazon SQS
- NATS
- In-Memory Queue
- Redis Streams
- Apache Pulsar
CAP 支持以下几种具有事务支持的数据库做为存储
- SQL Server
- MySQL
- PostgreSql
- MongoDB
- In-Memory Storage
CAP 监控
- Consul
- Dashboard
- Diagnostics
- OpenTelemetry
个人观点:
CAP与2CP、3CP、TCC不同之处,就是主业务本地事务提交成功后,没有回滚概念,所以性能相对高一些。子业务处理失败,会根据CAP配置策略进行重试,直至处理成功(达到策略次数后通过人工处理) 达到最终数据一致性。
注:因为有重试所以子业务必须处理重复消费MQ消息的业务处理来保证同消息不被成功处理N次。
案例说明
案例环境
window10、vs 2022、.net6.0、 mysql 5.6.39、RabbitMQ 3.6.6、Redis
VS 2022 新增两个项目:ASP.NET Core Web应用(模型-视图-控制器)、ASP.NET Core Web API
项目来代表主业务微服务、子业务微服务
NuGet 添加包引用安装
<PackageReference Include="DotNetCore.CAP" Version="6.1.0" />
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="6.1.0" />
<PackageReference Include="DotNetCore.CAP.InMemoryStorage" Version="6.1.0" />
<PackageReference Include="DotNetCore.CAP.MySql" Version="6.1.0" />
<PackageReference Include="DotNetCore.CAP.RabbitMQ" Version="6.1.0" />
<PackageReference Include="DotNetCore.CAP.RedisStreams" Version="6.1.0" />
根据自身所需安装对应运输、存储、监控对应包
Cap相关注入
两个项目都注入cap,数据库可以配置同一个,也可以分开
启动项目会自动生成两个表
Published 表结构:
NAME |
DESCRIPTION |
TYPE |
Id |
Message Id |
int |
Version |
Message Version |
string |
Name |
Topic Name |
string |
Content |
Json Content |
string |
Added |
Added Time |
DateTime |
ExpiresAt |
Expire time |
DateTime |
Retries |
Retry times |
int |
StatusName |
Status Name |
string |
Received 表结构:
NAME |
DESCRIPTION |
TYPE |
Id |
Message Id |
int |
Version |
Message Version |
string |
Name |
Topic Name |
string |
Group |
Group Name |
string |
Content |
Json Content |
string |
Added |
Added Time |
DateTime |
ExpiresAt |
Expire time |
DateTime |
Retries |
Retry times |
int |
StatusName |
Status Name |
string |
生产者与消费者
主项目添加生产消息PublishController
同项目下两个子业务订阅了send、send1消息,携带请求头信息,不同项目子业务订阅了send2消息,指定callbackName进行回调
子项目添加消费消息ConsumerController
启动两个项目,主项目监控配置用的是Dashboard。所以我们可以访问/cap 进行可视化Published、Received 成功和失败内容
RabbitMq自动创建内容: 如果注入时没配置Exchanges,将自动生成一个Exchanges:cap.default.router
调用send
主业务广播一条消息
子业务接收消费消息:group1、group2各一条
调用send1
假设子业务处理异常,广播消息成功,消费失败,将按策略配置进行重试
过一段时间回头看看,重试次数一直在加,直到我们配置的20次后停止,进行邮件发送通知人工处理
调用send2
参考文档:https://cap.dotnetcore.xyz/user-guide/zh/getting-started/quick-start/
DotNetCore.Cap分布式事务实现最终一致性相关推荐
- 使用MQ来保证分布式事务的最终一致性
使用MQ来保证分布式事务的最终一致性 使用MQ来保证分布式事务的最终一致性 参考URL:https://www.bbsmax.com/A/obzbM9QVdE/ 生产者的逻辑 1.订单入库 2.消息记 ...
- MQ如何保证分布式事务的最终一致性
分布式事务:业务相关的多个操作,保证他们同时成功或者同时失败 最终一致性:与之对应的就是强一致性 MQ中要保证事务的最终一致性,就需要做到两点 1.生产者要保证100%的消息投递.事务消息机制 2.消 ...
- 分布式事务——消息最终一致性方案
前言 分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用.虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务 ...
- 【分布式事务】最终一致性解决方案
对于分布式事务一般采用的都是最终一致性方案,而不是强一致性.而在使用最终一致性的方案时,一定要提到的一个概念是状态机. 什么是状态机?是一种特殊的组织代码的方式,用这种方式能够确保你的对象随时都知道自 ...
- 「分布式架构」最终一致性:反熵
在这个博客系列中,我们将探讨最终的一致性,如果没有合适的词汇表,这个术语很难定义.这是许多分布式系统使用的一致性模型,包括XDB Enterprise edition.理解最终一致性需要两个概念:暗示 ...
- 分布式事务之最终一致的Mq实现
问题的起源 分布式系统的特性 对分布式系统有过研究的读者,可能听说过"CAP定律"."Base理论"等,非常巧的是,化学理论中ACID是酸.Base恰好是碱.这 ...
- asp.net core集成CAP(分布式事务总线)
一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...
- 分布式事务及分布式系统一致性解决方案
在分布式系统中,同时满足"一致性"."可用性"和"分区容错性"三者是不可能的.分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? ...
- 图解分布式之:最终一致性,一致只会迟到,但绝不缺席
提到分布式系统,就一定绕不开"一致性",这次我们说说:最终一致性. 最终一致性是现在大部分高可用的分布式系统的核心思路. 估计有人对最终一致性不太熟,先来个简单介绍: 最终一致性指 ...
最新文章
- 终于把XGBoost总结写出来了!
- setitimer 创建两个定时器_JavaScript第二十四篇 高级定时器(下)
- Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
- 利用samba和mount命令 进行文件共享
- 中国最大的python社区-python最大并发
- mac中python怎么打开中文txt文件-mac在matplotlib中显示中文的操作方法
- 软件工程方法论对我们开发软件有多大用处?谈谈你的看法。
- P1351 联合权值
- python3虚拟环境搭建_python3 =虚拟环境的搭建
- Poj 1611 The Suspects
- Java别说取余( )运算简单,你真的会吗
- mysql binlog mixed_MySQL Binlog三种格式介绍及分析
- Mysql更新计数器_MySQL实现计数器如何在高并发场景下更新并保持数据正确性
- 公平的反义词是什么?
- 诺基亚困境,力掐苹果?
- NLP和CV的双子星,注入Mask的预训练模型BERT和MAE
- 8s pod 查看 的yaml_k8s之深入解剖Pod(二)
- 支付宝 RSA和RSA2签名算法区别
- JS 页面刷新/数据刷新
- 下列不是SQL的服务器组件,北语网院15秋《数据库应用(SQL server)》作业3答案...
热门文章
- 来看阿迅为4412开发板独立文档和程序源码汇总目录
- 功能性模块:(8)一文理解常用激活函数(Sigmoid,ReLU,ELU,GELU...)
- 令人抓狂的ORA-01722: 无效数字
- python日期时间函数详解
- tcl手机 手写java_3533手机世界--绝对超值 小巧女性手写手机突破1K5--www.3533.com
- RPA机器人的两种类型与未来发展
- 中小型数据库 RMAN CATALOG 备份恢复方案(一)
- [BZOJ 1037] 生日聚会Party
- 对单用户计算机来说在,(电大网考计算机自检自测2.doc
- spring @Transactional事务未提交导致的并发问题