.NET Core 分布式事务 CAP 发布 6.1 正式版

前言

我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性。

那么,接下来我们具体看一下吧。.

总览

可能有些人还不知道 CAP 是什么,老规矩来一个简介。

CAP地址:https://github.com/dotnetcore/CAP)

是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为 EventBus 使用,该项目诞生于2016年,目前在 Github 已经有超过 5500+ Star 和 70+ 贡献者,以及在 NuGet超 250 万的下载量,并在越来越多公司的和项目中得到应用。

如果你想对 CAP 更多了解,请查看我们的 

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

本次在 CAP 6.1 版本中我们主要带来了以下新特性:

  • 优化雪花算法
  • Dashboard 支持自定义 Authorization Policy
  • Azure Service Bus 添加对延迟消息的支持
  • 支持配置失败消息过期删除时间
  • BUG 修复
    • 修复 Dashbaord 启用 Challenge 验证顺序问题
    • 修复 RabbitMQ 在网络抖动时偶发健康检查错误的问题
    • 修复 MySQL 8.0 重试查询时 SQL日期格式错误的问题
    • 修复 Redis Streams 读取或创建流时幂等检查的问题

优化雪花算法

在过去我们使用标准版雪花算法,会出现时钟敏感问题。

因为ID生成总是和当前操作系统的时间戳绑定的(利用了时间的单调递增性)),因此若操作系统的时钟出现回拨,生成的ID就会重复,一般不会人为地去回拨时钟,但服务器会有偶发的"时钟漂移"现象。

也就是说在多节点部署时,如果某些服务器时间不准确会导致重复键生成而导致写入消息到数据库时报错。

在本版本中,解除与操作系统时间戳的时刻绑定,生成器只在初始化时获取了系统当前的时间戳,作为初始时间戳, 但之后就不再与系统时间戳保持同步了。它之后的递增,只由序列号的递增来驱动。

比如序列号当前值是4095,下一个请求进来, 序列号+1溢出12位空间,序列号重新归零,而溢出的进位则加到时间戳上,从而让时间戳+1。

在此版本更新后,生成的Id可能会出现和之前版本出现较大差值,大家注意下就行,没啥影响。

Dashboard 支持自定义 Authorization Policy

在这个版本中,我们的Dashboard 配置项中新增了一个名为 AuthorizationPolicy 的配置项,用于想要在授权过程中使用例如基于角色的授权验证等场景。

用法如下,主要是有注释的部分。

services.AddAuthorization((options =>
{
   // only if you want to apply role filter to CAP Dashboard user 
   options.AddPolicy("PolicyCap", policy => policy.RequireRole("admin.events"));
}))
.AddAuthentication(options =>
{
   options.DefaultScheme =  CookieAuthenticationDefaults.AuthenticationScheme;
   options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
   options.Authority = "https://demo.identityserver.io/";
   options.ClientId = "interactive.confidential";
   options.ClientSecret = "secret";
   options.ResponseType = "code";
   options.UsePkce = true;

   options.Scope.Clear();
   options.Scope.Add("openid");
   options.Scope.Add("profile");
});

services.AddCap(cap =>
{
    cap.UseDashboard(d =>
    {
        d.UseChallengeOnAuth = true;
        d.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        d.UseAuth = true;
        // only if you want to apply policy authorization filter to CAP Dashboard user
        d.AuthorizationPolicy = "PolicyCap";
    });
    // ***
}

Azure Service Bus 添加对延迟消息的支持

在 Azure Service Bus 中原生提供了对延迟发送消息的支持,也就是利用其 ScheduledEnqueueTimeUtc 属性设置。

在本版本中通过 CAP 在发送过程中指定头消息以利用此特性。

示例如下:

[HttpPost("publish")]
public async Task Publish()
{
    await _publisher.PublishAsync("demo-publish", string.Empty, new Dictionary<string, string?>
    {
        [AzureServiceBusHeaders.ScheduledEnqueueTimeUtc] = DateTimeOffset.UtcNow.AddSeconds(60).ToString(),
    });
}

顺便说一下,有一些同学之前也提起了在 RabbitMQ 中对延迟消息的支持,我们一致没有对其进行支持,一是因为需要它配置插件才可以不是原生支持,二是还是希望大家能使用调度器(Quartz,Hangfire)等来做这件事情,专业的事情交给专业的组件做。

支持配置失败消息过期删除时间

我们新增了一个配置项 FailedMessageExpiredAfter 用于配置失败的消息过期时间,到达过期时间后,消息会被删除。之前这个是写死的值 15 天,现在你可以利用此配置项进行配置。

BUG 修复

在这个版本中,我们进行了一些已发现的BUG修复,下面是修复的内容项。

  • 修复 Dashbaord 启用 Challenge 验证顺序问题。
  • 修复 RabbitMQ 在网络抖动时偶发健康检查错误的问题。
  • 修复 MySQL 8.0 重试查询时 SQL日期格式错误的问题
  • 修复 Redis Streams 读取或创建流时幂等检查的问题

总结

以上,就是本版本我们做出的一些支持和改动,感谢大家的支持,我们很开心能够帮助到大家 。

大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。

如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。

GitHub:https://github.com/dotnetcore/CAP/stargazers