CAP 6.1 版本釋出通告

2022-06-10 18:03:08

前言

今天,我們很高興宣佈 CAP 釋出 6.1 版本正式版,在這個版本中我們主要針對目前已經發現的幾個BUG進行了修復了以及新增了一些小特性。

那麼,接下來我們具體看一下吧。

總覽

可能有些人還不知道 CAP 是什麼,老規矩來一個簡介。

CAP 是一個用來解決微服務或者分散式系統中分散式事務問題的一個開源專案解決方案(https://github.com/dotnetcore/CAP)同樣可以用來作為 EventBus 使用,該專案誕生於2016年,目前在 Github 已經有超過 5500+ Star 和 70+ 貢獻者,以及在 NuGet超 250 萬的下載量,並在越來越多公司的和專案中得到應用。

如果你想對 CAP 更多瞭解,請檢視我們的 官方檔案

本次在 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可能會出現和之前版本出現較大差值,大家注意下就行,沒啥影響。

感謝 @Allen-dududu 對此提交的PR!

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";
    });
    // ***
}

感謝 @albertopm19 對此提交的PR!

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(),
    });
}

感謝 @webinex 對此提交的PR!

順便說一下,有一些同學之前也提起了在 RabbitMQ 中對延遲訊息的支援,我們一致沒有對其進行支援,一是因為需要它設定外掛才可以不是原生支援,二是還是希望大家能使用排程器(Quartz,Hangfire)等來做這件事情,專業的事情交給專業的元件做。

支援設定失敗訊息過期刪除時間

我們新增了一個設定項 FailedMessageExpiredAfter 用於設定失敗的訊息過期時間,到達過期時間後,訊息會被刪除。之前這個是寫死的值 15 天,現在你可以利用此設定項進行設定。

感謝 @dima-zhemkov 對此提交的PR!

BUG 修復

在這個版本中,我們進行了一些已發現的BUG修復,下面是修復的內容項。

  • 修復 Dashbaord 啟用 Challenge 驗證順序問題。
  • 修復 RabbitMQ 在網路抖動時偶發健康檢查錯誤的問題。
  • 修復 MySQL 8.0 重試查詢時 SQL日期格式錯誤的問題
  • 修復 Redis Streams 讀取或建立流時冪等檢查的問題

總結

以上,就是本版本我們做出的一些支援和改動,感謝大家的支援,我們很開心能夠幫助到大家 。大家在使用的過程中遇到問題希望也能夠積極的反饋,幫助CAP變得越來越好。