今天,我們很高興宣佈 CAP 釋出 7.1 版本正式版,我們在這個版本中解決了一個長期以來的問題,也新增了幾個小特性及修復了幾個Bug。
從 NuGet 資料來看,我們於去年底釋出的7.0版本非常受歡迎,如果你還沒有看到我們 7.0 的新特性的話,這裡是傳送門。
現在 CAP 在 NuGet 的下載量已經超過了400萬,作為一個非工具類的庫,還是非常厲害的。當然這不僅僅是作者我一個人的功勞,還得益於我們的使用者,反饋者,特別是貢獻者。說到貢獻者,自7.0版本以來,我們又增加了幾個貢獻者。分別是:@周潭潭,@Giorgi Lekveishvili,@Taha İPEK,@李正浩,@Mustafa Çağatay Kızıltan。
下面,具體看一下我們新版本的功能吧。
可能有些人還不知道 CAP 是什麼,老規矩來一個簡介。
CAP 是一個用來解決微服務或者分散式系統中分散式事務問題的一個開源專案解決方案(https://github.com/dotnetcore/CAP)同樣可以用來作為 EventBus 使用,該專案誕生於2016年,目前在 Github 已經有超過 5.9k Star 和 90+ 貢獻者,以及在 NuGet超 400 萬的下載量,並在越來越多公司的和專案中得到應用。
如果你想對 CAP 更多瞭解,請檢視我們的 官方檔案。
本次在 CAP 7.1 版本中我們主要帶來了以下新特性:
對CAP比較熟悉的使用者知道,CAP內部有一個重試的執行緒預設每隔1分鐘來讀取儲存的訊息用於對傳送或消費失敗的訊息進行重試,單個範例沒有什麼問題,那麼在啟用多個範例的場景下會有一定機率出現並行讀的情況,這就會導致訊息被重複傳送或消費。過去我們要求消費者對關鍵訊息進行冪等性保證來避免負面影響,現在我們提供了一種方式來避免這種情況發生。
在 7.1.0 版本中,我們新增了一個設定項 UseStorageLock
來支援設定基於資料庫的分散式鎖,這樣可以避免多範例並行讀的問題,並且對異常場景的處理也進行了考慮。
注意:在開啟 UseStorageLock
後,系統將會生成一個 cap.lock 的資料庫表,此表用於通過資料庫來實現分散式鎖。
感謝 @李正浩 對此提交的PR。我想特別說一下,我們不認識 ,但是半夜12點多還在GitHub和我討論問題,提交程式碼(#1272,#1274),應該是一個很努力的小夥子,我們這次這個長期以來的問題就是他貢獻的PR,所以特別感謝,他的部落格 https://www.lizhenghao.site
我們在RabbitMQ中新增了對 BasicQos 的設定項支援,BasicQos主要用於設定RabbitMQ中訊息分發給消費者的 PrefetchCount,也就是未Ack的數量。
通過在UseRabbitMQ中的 BasicQosOptions
來設定,用法如下:
services.AddCap(x =>
{
x.UseRabbitMQ(y =>
{
y.BasicQosOptions = new DotNetCore.CAP.RabbitMQOptions.BasicQos(3);
});
});
感謝 @nunorelvao 對此提交的PR。
在這個版本中,我們將 Microsoft.Azure.ServiceBus
使用者端包變更為了 Azure.Messaging.ServiceBus
。
Microsoft.Azure.ServiceBus
目前已經被棄用,官方建議建議使用 Azure.Messaging.ServiceBus。
感謝 @Giorgi Lekveishvili 對此提交的 PR。
過去,CAP只支援將訊息傳送到Azure Service Bus中的一個Topic 上,但是實際使用過程中有時候需要傳送到多個Topic,此版本提供對根據訊息型別設定傳送Topic的選項的支支援。
用法如下:
capOptions.UseAzureServiceBus(asb =>
{
// other configuration
asb.ConfigureCustomProducer<EntityCreatedForIntegration>(cfg => cfg.WithTopic("entity-created"));
});
感謝 @mviegas , @jonekdahl 對此提交的PR。
我們對 Azure Service Bus 新增了對 SQL Filter 設定項的支援,你可以在訂閱訊息的時候,通過設定Sql Filter 來只訂閱你需要的訊息,而不必在業務邏輯中進行過濾。用法如下:
c.UseAzureServiceBus(asb =>
{
asb.ConnectionString = ...
asb.SQLFilters = new List<KeyValuePair<string, string>> {
new KeyValuePair<string,string>("IOTFilter","FromIOTHub='true'"),//The message will be handled if ApplicationProperties contains IOTFilter and value is true
new KeyValuePair<string,string>("SequenceFilter","sys.enqueuedSequenceNumber >= 300")
};
});
感謝 @Giorgi Lekveishvili 對此提供的 PR。
在這個版本中,我們提供了新的非同步擴充套件方法用於開啟事務,並且支援傳遞 IsolationLevel 引數,感謝 @Mahmoud Shaheen 對此提交的PR!
另外在這個版本中,我們修復了一些已知的Bug,以下是已經修復的問題列表。
以上,就是本版本我們做出的一些新特性和改動,感謝大家的支援,我們很開心能夠幫助到大家 。
大家在使用的過程中遇到問題希望也能夠積極的反饋,幫助CAP變得越來越好。