项目演化过程中,微服务已经遍地开花。一个大项目下几十上百个微服务已经是常态。但衍生出另外一个问题就是跨微服务事务,跨库事务的分布式事务。市面了解过的有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分布式事务实现最终一致性相关推荐

  1. 使用MQ来保证分布式事务的最终一致性

    使用MQ来保证分布式事务的最终一致性 使用MQ来保证分布式事务的最终一致性 参考URL:https://www.bbsmax.com/A/obzbM9QVdE/ 生产者的逻辑 1.订单入库 2.消息记 ...

  2. MQ如何保证分布式事务的最终一致性

    分布式事务:业务相关的多个操作,保证他们同时成功或者同时失败 最终一致性:与之对应的就是强一致性 MQ中要保证事务的最终一致性,就需要做到两点 1.生产者要保证100%的消息投递.事务消息机制 2.消 ...

  3. 分布式事务——消息最终一致性方案

    前言 分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用.虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务 ...

  4. 【分布式事务】最终一致性解决方案

    对于分布式事务一般采用的都是最终一致性方案,而不是强一致性.而在使用最终一致性的方案时,一定要提到的一个概念是状态机. 什么是状态机?是一种特殊的组织代码的方式,用这种方式能够确保你的对象随时都知道自 ...

  5. 「分布式架构」最终一致性:反熵

    在这个博客系列中,我们将探讨最终的一致性,如果没有合适的词汇表,这个术语很难定义.这是许多分布式系统使用的一致性模型,包括XDB Enterprise edition.理解最终一致性需要两个概念:暗示 ...

  6. 分布式事务之最终一致的Mq实现

    问题的起源 分布式系统的特性 对分布式系统有过研究的读者,可能听说过"CAP定律"."Base理论"等,非常巧的是,化学理论中ACID是酸.Base恰好是碱.这 ...

  7. asp.net core集成CAP(分布式事务总线)

    一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...

  8. 分布式事务及分布式系统一致性解决方案

    在分布式系统中,同时满足"一致性"."可用性"和"分区容错性"三者是不可能的.分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? ...

  9. 图解分布式之:最终一致性,一致只会迟到,但绝不缺席

    提到分布式系统,就一定绕不开"一致性",这次我们说说:最终一致性. 最终一致性是现在大部分高可用的分布式系统的核心思路. 估计有人对最终一致性不太熟,先来个简单介绍: 最终一致性指 ...

最新文章

  1. 终于把XGBoost总结写出来了!
  2. setitimer 创建两个定时器_JavaScript第二十四篇 高级定时器(下)
  3. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
  4. 利用samba和mount命令 进行文件共享
  5. 中国最大的python社区-python最大并发
  6. mac中python怎么打开中文txt文件-mac在matplotlib中显示中文的操作方法
  7. 软件工程方法论对我们开发软件有多大用处?谈谈你的看法。
  8. P1351 联合权值
  9. python3虚拟环境搭建_python3 =虚拟环境的搭建
  10. Poj 1611 The Suspects
  11. Java别说取余( )运算简单,你真的会吗
  12. mysql binlog mixed_MySQL Binlog三种格式介绍及分析
  13. Mysql更新计数器_MySQL实现计数器如何在高并发场景下更新并保持数据正确性
  14. 公平的反义词是什么?
  15. 诺基亚困境,力掐苹果?
  16. NLP和CV的双子星,注入Mask的预训练模型BERT和MAE
  17. 8s pod 查看 的yaml_k8s之深入解剖Pod(二)
  18. 支付宝 RSA和RSA2签名算法区别
  19. JS 页面刷新/数据刷新
  20. 下列不是SQL的服务器组件,北语网院15秋《数据库应用(SQL server)》作业3答案...

热门文章

  1. 来看阿迅为4412开发板独立文档和程序源码汇总目录
  2. 功能性模块:(8)一文理解常用激活函数(Sigmoid,ReLU,ELU,GELU...)
  3. 令人抓狂的ORA-01722: 无效数字
  4. python日期时间函数详解
  5. tcl手机 手写java_3533手机世界--绝对超值 小巧女性手写手机突破1K5--www.3533.com
  6. RPA机器人的两种类型与未来发展
  7. 中小型数据库 RMAN CATALOG 备份恢复方案(一)
  8. [BZOJ 1037] 生日聚会Party
  9. 对单用户计算机来说在,(电大网考计算机自检自测2.doc
  10. spring @Transactional事务未提交导致的并发问题