在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET Standard 的 C# 库:CAP。
CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点。CAP 是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。
事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以将事件发送到Eventbus,而无需知道是谁来接听或有多少其他人来接听。组件也可以侦听Eventbus上的事件,而无需知道谁发送了事件。这样,组件可以相互通信而无需相互依赖。同样,很容易替换一个组件。只要新组件了解正在发送和接收的事件,其他组件就永远不会知道。
图片
SQL Server、MySQL、PostgreSql、MongoDB、In-Memory Storage。
RabbitMQ、Kafka、Azure Service Bus、Amazon SQS、NATS、In-Memory Queue、Redis Streams、Apache Pulsar。
图片
图片
图片
//你可以按需选择下面的包进行安装: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
图片
// 按需选择安装你正在使用的数据库:PM> Install-Package DotNetCore.CAP.SqlServerPM> Install-Package DotNetCore.CAP.MySqlPM> Install-Package DotNetCore.CAP.PostgreSqlPM> Install-Package DotNetCore.CAP.MongoDB
图片
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 上添加 CapSubscribeAttribute 来订阅相关消息。
public class PublishController : Controller{ [CapSubscribe("xxx.services.show.time")] public void CheckReceivedMessage(DateTime datetime) { Console.WriteLine(datetime); }}
如果你的订阅方法没有位于 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) { } }}
更多项目实用功能和特性欢迎前往项目开源地址查看
本文链接:http://www.28at.com/showinfo-26-35288-0.html.NET开源的处理分布式事务的解决方案
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 消息队列备选架构选择,你选择哪个?