跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. 前言
  2. CAP 项目介绍
  3. 什么是 EventBus?
  4. CAP 架构预览
  5. CAP 支持的存储
  6. CAP 支持以下几种运输方式
  7. 怎么选择运输器
  8. 快速开始
  9. 安装 DotNetCore.CAP Nuget 包
  10. CAP 支持主流的消息队列作为传输器
  11. CAP 提供了主流数据库作为存储
  12. 配置 CAP 到 Program.cs 文件中
  13. 发布
  14. 订阅
  15. Action Method
  16. Service Method
  17. 官方文档
  • 💰 8折买阿里云服务器限时8折了解详情
C#

.NET 开源分布式事务解决方案:CAP

CAP 是基于 .NET Standard 的 C# 库,提供分布式事务解决方案及 EventBus 功能。支持 SQL Server、MySQL、PostgreSQL、MongoDB 等存储,兼容 RabbitMQ、Kafka、Azure Service Bus 等多种消息队列传输器。通过配置 EntityFramework 或 MongoDB 上下文及消息中间件连接信息,可在 Controller 或 Service 层利用 ICapPublisher 发布消息,并通过 CapSubscribeAttribute 或 ICapSubscribe 接口订阅处理消息,确保微服务系统中的数据最终一致性。

活在当下发布于 2025/2/40 浏览
.NET 开源分布式事务解决方案:CAP

前言

在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战。本文介绍一个基于 .NET Standard 的 C# 库:CAP。

CAP 项目介绍

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

什么是 EventBus?

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

CAP 架构预览

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 包

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

官方文档

更多信息请参考官方文档:https://cap.dotnetcore.xyz/

  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • 8 款值得推荐的 WPF UI 控件库
  • Apache Shiro JSP 标签库详解
  • 基于 Java SSM 的网上挂号系统设计与实现
  • PyTorch 自定义特征嵌入模块 FeatureEmbedder 实现解析
  • 666 条数据训练 AI 写万字长文,模型数据集开源
  • Qwen2 模型开源详情及百万级上下文扩展方案
  • 基于 Spring Boot 和 Vue 的售楼管理系统设计与实现
  • Redis 与 NoSQL 基础学习笔记
  • 接口测试用例模板详细说明
  • CSS 基础:width 与 height 尺寸属性详解
  • Spring Boot 基于 Vue 的工厂车间管理系统设计
  • Flowable 工作流高级应用:任务分配与网关控制
  • Kubernetes: 使用 kubectl 插件 ketall 查看所有 API 对象资源
  • VMware vSAN 7.0 使用 RVC 将闪存设备标记为容量设备
  • Ansible iptables 模块参数详解与实战示例
  • BPMN 边界事件详解及代码实现
  • 百度旋转验证码 v2 逆向分析及 fs 参数生成逻辑
  • 蒙特卡罗树搜索 (MCTS) 原理与代码实例
  • GLM 语言模型原理与代码实例
  • 线性代数导引:可构造数域 K

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online