当前位置:首页 > 科技  > 软件

.NET开源的处理分布式事务的解决方案

来源: 责编: 时间:2023-11-30 09:28:04 151观看
导读前言在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP

前言

在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。QY028资讯网——每日最新资讯28at.com

CAP项目介绍

CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。QY028资讯网——每日最新资讯28at.com

什么是 EventBus?

事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样,很容易替换一个组件。只要新组件了解正在发送和接收的事件,其他组件就永远不会知道。QY028资讯网——每日最新资讯28at.com

CAP架构预览

图片图片QY028资讯网——每日最新资讯28at.com

CAP支持的存储

SQL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。QY028资讯网——每日最新资讯28at.com

CAP 支持以下几种运输方式

RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、Redis Streams、Apache Pulsar。QY028资讯网——每日最新资讯28at.com

怎么选择运输器

图片图片QY028资讯网——每日最新资讯28at.com

项目源码

图片图片QY028资讯网——每日最新资讯28at.com

快速开始

安装DotNetCore.CAP Nuget包

图片图片QY028资讯网——每日最新资讯28at.com

CAP 支持主流的消息队列作为传输器:

  • 我本地安装的是DotNetCore.CAP.RabbitMQ。
//你可以按需选择下面的包进行安装:PM> Install-Package DotNetCore.CAP.KafkaPM> Install-Package DotNetCore.CAP.RabbitMQPM> Install-Package DotNetCore.CAP.AzureServiceBusPM> Install-Package DotNetCore.CAP.AmazonSQSPM> Install-Package DotNetCore.CAP.NATSPM> Install-Package DotNetCore.CAP.RedisStreamsPM> Install-Package DotNetCore.CAP.Pulsar

图片图片QY028资讯网——每日最新资讯28at.com

CAP 提供了主流数据库作为存储:

  • 我本地安装的是DotNetCore.CAP.MongoDB。
// 按需选择安装你正在使用的数据库:PM> Install-Package DotNetCore.CAP.SqlServerPM> Install-Package DotNetCore.CAP.MySqlPM> Install-Package DotNetCore.CAP.PostgreSqlPM> Install-Package DotNetCore.CAP.MongoDB

图片图片QY028资讯网——每日最新资讯28at.com

配置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 进行消息发送。QY028资讯网——每日最新资讯28at.com

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 来订阅相关消息。QY028资讯网——每日最新资讯28at.com

public class PublishController : Controller{    [CapSubscribe("xxx.services.show.time")]    public void CheckReceivedMessage(DateTime datetime)    {        Console.WriteLine(datetime);    }}

Service Method

如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe:QY028资讯网——每日最新资讯28at.com

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)        {        }    }}

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看

本文链接:http://www.28at.com/showinfo-26-35288-0.html.NET开源的处理分布式事务的解决方案

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 消息队列备选架构选择,你选择哪个?

下一篇: 利用 Golang 中的 Recover 处理错误

标签:
  • 热门焦点
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    OPPO、vivo、小米等国内厂商Q2在印度智能手机市场份额依旧高达55%

    7月20日消息,据外媒报道,研究机构的报告显示,在全球智能手机出货量同比仍在下滑的大背景下,印度这一有潜力的市场也未能幸免,出货量同比也有下滑,多家厂
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 苹果140W USB-C充电器:采用氮化镓技术

    苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top