经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET开源的处理分布式事务的解决方案
来源:cnblogs  作者:追逐时光者  时间:2023/12/1 9:09:51  对本文有异议

前言

在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.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。

  1. //你可以按需选择下面的包进行安装:
    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。

  1. // 按需选择安装你正在使用的数据库:
    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 文件中,如下:

  1.             builder.Services.AddCap(=>
                {
                    //如果你使用的 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 进行消息发送。

  1. 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 来订阅相关消息。

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

Service Method

如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe:


  1. 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开源地址:https://github.com/dotnetcore/CAP

官方文档:https://cap.dotnetcore.xyz/

优秀项目和框架精选

该项目已收录到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技术社区微信交流群??

原文链接:https://www.cnblogs.com/Can-daydayup/p/17868155.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号