.NET开源的处理分布式事务的解决方案
前言
在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。
CAP项目介绍
CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。
什么是 EventBus?
事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样,很容易替换一个组件。只要新组件了解正在发送和接收的事件,其他组件就永远不会知道。
CAP架构预览
CAP支持的存储
SQL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。
CAP 支持以下几种运输方式
RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、Redis Streams、Apache Pulsar。
怎么选择运输器
项目源码
快速开始
安装DotNetCore.CAP Nuget包
CAP 支持主流的消息队列作为传输器:
我本地安装的是DotNetCore.CAP.RabbitMQ。
//你可以按需选择下面的包进行安装:
PM> Install-Package DotNetCore.CAP.Kafka
PM> Install-Package DotNetCore.CAP.RabbitMQ
PM> Install-Package DotNetCore.CAP.AzureServiceBus
PM> Install-Package DotNetCore.CAP.AmazonSQS
PM> Install-Package DotNetCore.CAP.NATS
PM> Install-Package DotNetCore.CAP.RedisStreams
PM> Install-Package DotNetCore.CAP.Pulsar
CAP 提供了主流数据库作为存储:
我本地安装的是DotNetCore.CAP.MongoDB。
// 按需选择安装你正在使用的数据库:
PM> Install-Package DotNetCore.CAP.SqlServer
PM> Install-Package DotNetCore.CAP.MySql
PM> Install-Package DotNetCore.CAP.PostgreSql
PM> Install-Package DotNetCore.CAP.MongoDB
配置CAP到 Program.cs 文件中,如下:
builder.Services.AddCap(x =>{//如果你使用的 EF 进行数据操作,你需要添加如下配置://配置数据库上下文x.UseEntityFramework<AppDbContext>();//如果你使用的 MongoDB,你可以添加如下配置:x.UseMongoDB("ConnectionStrings"); //注意,仅支持MongoDB 4.0+集群//CAP RabbitMQ 配置x.UseRabbitMQ(rab => {rab.HostName = "192.0.1.1";rab.Password = "123456";rab.Port = 5672;rab.UserName = "123456";});});
发布
在 Controller 中注入 ICapPublisher 然后使用 ICapPublisher 进行消息发送。
public class PublishController : Controller
{private readonly ICapPublisher _capBus;public PublishController(ICapPublisher capPublisher){_capBus = capPublisher;}//不使用事务[Route("~/without/transaction")]public IActionResult WithoutTransaction(){_capBus.Publish("xxx.services.show.time", DateTime.Now);// Publish delay message_capBus.PublishDelayAsync(TimeSpan.FromSeconds(delaySeconds), "xxx.services.show.time", DateTime.Now);return Ok();}//Ado.Net 中使用事务,自动提交[Route("~/adonet/transaction")]public IActionResult AdonetWithTransaction(){using (var connection = new MySqlConnection(ConnectionString)){using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true)){//业务代码_capBus.Publish("xxx.services.show.time", DateTime.Now);}}return Ok();}//EntityFramework 中使用事务,自动提交[Route("~/ef/transaction")]public IActionResult EntityFrameworkWithTransaction([FromServices]AppDbContext dbContext){using (var trans = dbContext.Database.BeginTransaction(_capBus, autoCommit: true)){//业务代码_capBus.Publish("xxx.services.show.time", DateTime.Now);}return Ok();}
}
订阅
Action Method
在 Action 上添加 CapSubscribeAttribute 来订阅相关消息。
public class PublishController : Controller
{[CapSubscribe("xxx.services.show.time")]public void CheckReceivedMessage(DateTime datetime){Console.WriteLine(datetime);}
}
Service Method
如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe:
namespace xxx.Service
{public interface ISubscriberService{void CheckReceivedMessage(DateTime datetime);}public class SubscriberService: ISubscriberService, ICapSubscribe{[CapSubscribe("xxx.services.show.time")]public void CheckReceivedMessage(DateTime datetime){}}
}
项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看👀,别忘了给项目一个Star支持💖。
GitHub开源地址:GitHub - dotnetcore/CAP: Distributed transaction solution in micro-service base on eventually consistency, also an eventbus with Outbox pattern
官方文档:CAP
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
- 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
欢迎加入DotNetGuide技术社区微信交流群👪
相关文章:
.NET开源的处理分布式事务的解决方案
前言 在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。 CAP项目介绍 CA…...
如何隐藏选择选项值并用新值替换2个选项?
要隐藏选择选项值并用新值替换2个选项,可以使用JavaScript来实现。 首先,使用JavaScript获取两个选项的值,然后将这两个值设置为新的值,最后将这两个选项的可见性设置为false,以隐藏它们。 例如: <se…...
[读论文][跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion
github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式(训练Task蒸馏outKD-FeatKD) 训练数据集 评测指标…...
机器学习的复习笔记1
机器学习是一种人工智能的分支,它通过让计算机从数据中学习规律和模式,从而实现对未知数据的预测和决策。根据不同的学习方法和任务,机器学习可以分为以下几种类型: 监督学习:在监督学习中,计算机会被提供一…...
【Spring Boot】如何集成Swagger
Swagger简单介绍 Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。功能主要包含以下几点: 可以使前后端分离开发更加方便,有利于团队协作接口文档可以在线自动生成,有利于降低后端开发人员编写…...
优化-查询数据接口太慢
有一个查询接口,主业务表有几万多条数据,没超过十万,由于没有使用分页,所以每次查询都要返回大几万的数据,然后问题是前端页面查询数据显示数据要转很久。 压缩响应体大小 我发现查询的时间是1秒多,但是浏…...
c++ 谓词
1. 一元谓词 #include <iostream> #include<vector> #include<algorithm>using namespace std;class CreaterFive{ public:bool operator()(int val){return val>5;} };int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}ve…...
一篇总结 Linux 系统启动的几个汇编指令
学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。 一.数据处理指令 1.数据传送指令 【MOV指令】 把一个寄存器的值(立即数)赋给另一个寄存器,或者将一个…...
python技术栈之单元测试中mock的使用
什么是mock? mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试,需要虚拟某些特定对象以便测试…...
LeetCode(37)矩阵置零【矩阵】【中等】
目录 1.题目2.答案3.提交结果截图 链接: 73. 矩阵置零 1.题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]…...
[Python入门系列之十一]在windows上安装OpenCV
1-安装OpenCV 如果是python3.7–python3.9(已测试),直接安装即可 注:conda需要先激活虚拟环境后再安装 pip install opencv-python如果安装速度慢,使用下面的指令: pip install opencv-python -i https://pypi.tuna.tsinghua.e…...
论文阅读——SEEM
arxiv: 分割模型向比较灵活的分割的趋势的转变:封闭到开放,通用到特定、one-shot到交互式。From closed-set to open-vocabulary segmentation,From generic to referring segmentation,From one-shot to interactive segmentati…...
Python入门06布尔值
目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义,布尔值是一种数据类型,它只有两个可能的值:True(真)或 False&…...
js查询详情接口控制执行时间的命令
在JavaScript中,可以使用console.time()和console.timeEnd()来控制执行时间的命令。 console.time()用于开始计时,可以指定一个标识符作为参数,用于标识计时器。 console.time(query); // 执行查询操作 console.timeEnd(query); 执行上述代…...
Linux系统iptables
目录 一. 防火墙简介 1. 防火墙定义 2. 防火墙分类 ①. 网络层防火墙 ②. 应用层防火墙 二. iptables 1. iptables定义 2. iptables组成 ①. 规则表 ②. 规则链 3. iptables格式 ①. 管理选项 ②. 匹配条件 ③. 控制类型 四. 案例说明 1. 查看规则表 2. 增加新…...
每日一题 1410. HTML 实体解析器(中等,模拟)
模拟,没什么好说的 class Solution:def entityParser(self, text: str) -> str:entityMap {": ",': "",>: >,<: <,⁄: /,&: &,}i 0n len(text)res []while i < n:isEntity Falseif …...
Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)
博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…...
对抗产品团队中的认知偏误:给产品经理的专家建议
今天的产品经理面临着独特的挑战。他们不仅需要设计和构建创新功能,还必须了解这些功能将如何为客户带来价值并推进关键业务目标。如果不加以控制,认知偏差可能会导致您构建的内容与客户想要的内容或业务需求之间不一致。本文将详细阐述产品经理可以避免…...
element-ui表格无法横向拖动问题
是不是用到了fixed // 因为我只有在小屏显示不下的时候才会出现这个问题所以我在这里做了适配(建议把样式放在全局) media screen and (max-width: 1800px) {// 由于使用了fixed导致横向条无法拖动出现bug.Table-page .el-table__fixed {height: auto !important;bottom: 2px …...
每天学习一点点之 MySQL TINYINT
我已经不是第一次遇到关于 TINYINT 的问题了。在 MySQL 中,当我们将某个字段设置为 TINYINT,随着业务的扩展,我们可能会发现 TINYINT 的范围无法满足需求。这时需要修改字段属性。但如果表的数据量很大,或者由于分表导致涉及的表数…...
Qwen3-14B制造业工艺文档生成:设备操作SOP自动编写与版本管理
Qwen3-14B制造业工艺文档生成:设备操作SOP自动编写与版本管理 1. 引言:制造业文档自动化的迫切需求 在制造业生产现场,设备操作标准作业程序(SOP)是确保产品质量和生产安全的关键文档。传统SOP编写方式面临三大痛点: 人力成本高…...
Spring Data Redis实战全攻略:从集群部署到实时流处理
Spring Data Redis实战全攻略:从集群部署到实时流处理 【免费下载链接】spring-data-examples Spring Data Example Projects 项目地址: https://gitcode.com/gh_mirrors/sp/spring-data-examples Spring Data Redis是Spring生态中用于Redis数据存储的核心组…...
Hunyuan-MT-7B多语翻译实战:跨境电商独立站商品页SEO多语内容批量生成
Hunyuan-MT-7B多语翻译实战:跨境电商独立站商品页SEO多语内容批量生成 1. 项目背景与价值 跨境电商独立站面临的最大挑战之一,就是如何为不同语言市场的用户提供本地化的商品内容。传统的人工翻译方式成本高、效率低,而机器翻译又往往无法保…...
VideoAgentTrek-ScreenFilter效果展示:远程桌面RDP协议画面中窗口标题栏识别
VideoAgentTrek-ScreenFilter效果展示:远程桌面RDP协议画面中窗口标题栏识别 你有没有遇到过这样的场景?在观看远程桌面录屏或视频会议录像时,屏幕上密密麻麻的窗口标题栏、任务栏、系统托盘图标,让人眼花缭乱。特别是当需要分析…...
OpenClaw学习助手:用gemma-3-12b-it自动整理课程笔记与习题
OpenClaw学习助手:用gemma-3-12b-it自动整理课程笔记与习题 1. 为什么需要AI学习助手? 作为一名经常需要消化大量课程资料的技术从业者,我长期被三个问题困扰:PDF讲义信息碎片化难以形成体系、课堂重点难以快速提炼、错题整理耗…...
Chord视觉定位模型实战案例:自动驾驶道路元素(车道线/交通灯/行人)定位
Chord视觉定位模型实战案例:自动驾驶道路元素(车道线/交通灯/行人)定位 在真实自动驾驶场景中,单纯依赖传统目标检测模型往往面临泛化能力弱、小目标漏检、遮挡鲁棒性差等问题。而Chord——这个基于Qwen2.5-VL的多模态视觉定位服…...
别只盯着PID!用STM32的PWM差速控制,让你的循迹小车转弯更稳(附源码分析)
STM32 PWM差速控制:让循迹小车转弯更稳的实战技巧 循迹小车的核心挑战之一是如何实现平滑稳定的转弯控制。许多开发者习惯性地直接套用PID算法,却忽略了更基础的PWM差速控制策略。实际上,通过精心设计的PWM占空比调整方案,完全可以…...
如何快速集成gh_mirrors/ca/card到React/Vue/Angular:打造专业信用卡表单的完整指南
如何快速集成gh_mirrors/ca/card到React/Vue/Angular:打造专业信用卡表单的完整指南 【免费下载链接】card :credit_card: make your credit card form better in one line of code 项目地址: https://gitcode.com/gh_mirrors/ca/card gh_mirrors/ca/card是一…...
ReactNative项目OpenHarmony三方库集成实战:react-native-render-html
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 项目基于 RN 0.72.90 开发 📋 前言 在移动应用开发中,HTML 内容渲染是一项常见需求,特别是在新闻资讯、富文本编辑、邮件展示等场景中。React Native 原…...
基于Quansar的双自由度直升机离散时间控制器的设计与仿真分析
基于Quansar的双自由度直升机离散时间控制器 简介:基于Quansar的双自由度直升机,它有两个直流电机驱动器,俯仰角0和偏航角中 离散时间控制器是为这两个螺旋桨使用根轨迹法设计的 分别使用Matlab对所设计的两个控制器进行仿真,分析…...
