前言
今天,我们很高兴宣布 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 版本中我们主要带来了以下新特性:
- 添加配置项已启用对分布式锁的支持
- RabbitMQ 添加对 BasicQos 配置项的支持
- Azure Service Bus 客户端包更新为 Microsoft.Azure.ServiceBus
- Azure Service Bus 支持发布消息到多个Topic
- Azure Service Bus 添加 SQL Filter 的支持
- 添加对开启事务异步方法的支持
- BUG 修复
- 修复 Dashbaord 在 Balzor 应用中无法工作的问题
- 修复从 Dashboard 触发重新执行,消息无法执行的问题
- 修复 Redis Streams Json 序列化问题
- 修复 Redis Streams 读取或创建流时幂等检查的问题
添加配置项已启用对分布式锁的支持
对CAP比较熟悉的用户知道,CAP内部有一个重试的线程默认每隔1分钟来读取存储的消息用于对发送或消费失败的消息进行重试,单个实例没有什么问题,那么在启用多个实例的场景下会有一定几率出现并发读的情况,这就会导致消息被重复发送或消费。过去我们要求消费者对关键消息进行幂等性保证来避免负面影响,现在我们提供了一种方式来避免这种情况发生。
在 7.1.0 版本中,我们新增了一个配置项 UseStorageLock
来支持配置基于数据库的分布式锁,这样可以避免多实例并发读的问题,并且对异常场景的处理也进行了考虑。
注意:在开启 UseStorageLock
后,系统将会生成一个 cap.lock 的数据库表,此表用于通过数据库来实现分布式锁。
感谢 @李正浩 对此提交的PR。我想特别说一下,我们不认识 ,但是半夜12点多还在GitHub和我讨论问题,提交代码(#1272,#1274),应该是一个很努力的小伙子,我们这次这个长期以来的问题就是他贡献的PR,所以特别感谢,他的博客 https://www.lizhenghao.site
RabbitMQ 添加对 BasicQos 配置项的支持
我们在RabbitMQ中添加了对 BasicQos 的配置项支持,BasicQos主要用于配置RabbitMQ中消息分发给消费者的 PrefetchCount,也就是未Ack的数量。
通过在UseRabbitMQ中的 BasicQosOptions
来设置,用法如下:
services.AddCap(x => { x.UseRabbitMQ(y => { y.BasicQosOptions = new DotNetCore.CAP.RabbitMQOptions.BasicQos(3); }); });
感谢 @nunorelvao 对此提交的PR。
Azure Service Bus 客户端包更新为 Azure.Messaging.ServiceBus
在这个版本中,我们将 Microsoft.Azure.ServiceBus
客户端包变更为了 Azure.Messaging.ServiceBus
。
Microsoft.Azure.ServiceBus
目前已经被弃用,官方建议建议使用 Azure.Messaging.ServiceBus。
感谢 @Giorgi Lekveishvili 对此提交的 PR。
Azure Service Bus 支持发布消息到多个Topic
过去,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 的支持
我们对 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 修复
另外在这个版本中,我们修复了一些已知的Bug,以下是已经修复的问题列表。
- 修复 Dashbaord 在 Balzor 应用中无法工作的问题
- 修复从 Dashboard 触发重新执行,消息无法执行的问题
- 修复 Redis Streams Json 序列化问题
- 修复 Redis Streams 读取或创建流时幂等检查的问题
总结
以上,就是本版本我们做出的一些新特性和改动,感谢大家的支持,我们很开心能够帮助到大家 。
大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。😃
如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
本文地址:http://www.cnblogs.com/savorboard/p/cap-7-1.html
作者博客:Savorboard
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本