.Net Core 使用CAP框架实现异步化分布式事务

CAP是一款基于.net标准的库,该库是处理分布式事务的解决方案;它具有轻量级的、开源、易于使用、具有EventBus(事件总线)功能、持久化等特点。官方中文文档:https://cap.dotnetcore.xyz/user-guide/zh/getting-started/quick-start/

基础核心Nuget包:DotNetCore.CAP

EventBus(事件总线)Nuget包:DotNetCore.CAP.RabbitMQ、DotNetCore.CAP.Kafka、DotNetCore.CAP.AzureServiceBus

持久化Nuget包: DotNetCore.CAP.SqlServer、DotNetCore.CAP.MySql、DotNetCore.CAP.PostgreSql、DotNetCore.CAP.MongoDB

也可以使用内存时间存储缓存Nuget包:DotNetCore.CAP.InMemoryStorage

人工处理所需Nuget包:DotNetCore.CAP.Dashboard

以上四种Nuget包在生产环境一般至少需要选择一种,如:DotNetCore.CAP、DotNetCore.CAP.RabbitMQ、DotNetCore.CAP.SqlServer、DotNetCore.CAP.Dashboard

.Net Core 使用CAP框架实现异步化分布式事务_第1张图片

一、事件发布者核心代码

1.1 Startup.cs (ConfigureServices方法)配置内容

// 8、添加事件总线cap
services.AddCap(x => {
    // 8.1 使用内存存储消息(消息发送失败处理)
    // x.UseInMemoryStorage();
    // 8.1 使用EntityFramework进行存储操作
    x.UseEntityFramework();
    // 8.2 使用sqlserver进行事务处理,防止推送MQ失败,会在指定数据库中自动生成以"cap."开头的表
    x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
    // 8.3 使用RabbitMQ进行事件中心处理
    x.UseRabbitMQ(rb => {
        rb.HostName = "localhost";
        rb.UserName = "guest";
        rb.Password = "guest";
        rb.Port = 5672;
        rb.VirtualHost = "/";
    });
    // 8.4添加cap后台监控页面(人工处理);页面地址为“/cap”;如:http://www.site.com/cap
    x.UseDashboard();
    // 8.5配置定时器重试策略
    //x.FailedRetryInterval = 2; //重试间隔时间(秒),使用默认的就可以,可不用配置
    x.FailedRetryCount = 5; //重试次数
});

// 9、注册上下文到IOC容器
services.AddDbContext(options =>
{
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
});

1.2 事件发布代码

[Route("api/Teams")]
[ApiController]
public class AggregateController : ControllerBase
{
    private readonly ICapPublisher capPublisher;
    public AggregateController(ICapPublisher capPublisher)
    {
        this.capPublisher = capPublisher;
    }

    /// 
    /// 添加团队和成员信息
    /// 
    /// 
    [HttpPost]
    public ActionResult Post(string value)
    {
        Video video = new Video()
        {
            VideoUrl = "http://localhost:5365/dsdsdsd.mp4",
            MemberId =1
        };
        capPublisher.PublishAsync

二、事件消费者核心代码

1.1 Startup.cs (ConfigureServices方法)配置内容

   与事件发布者配置方式一样即可,参考1.1节

1.2 事件消费者代码

[Route("Video")]
[ApiController]
public class VideoController : ControllerBase
{
    private readonly IVideoService videoService;
    public VideoController(IVideoService videoService)
    {
        this.videoService = videoService;
    }
    /// 
    /// 视频添加
    /// 
    /// 
    /// 
    [NonAction] //用于标识此函数不是接口,将不能被http请求访问
    //[CapSubscribe("video.event.*")] // *  一对多匹配 # 一对一匹配
    [CapSubscribe("video.event.post")]
    public ActionResult

三、人工处理

当事件重试达到指定次数之后,需要进行人工干预;地址为:域名/cap;如:https://www.site.com/cap

如下图进行重新消费,重新消费之后,不会改变数据库事件状态,直接检查业务数据就可以了。

.Net Core 使用CAP框架实现异步化分布式事务_第2张图片

 

 

你可能感兴趣的:(微服务,.net,Core,.net,分布式事务,cap,事件总线)