前言
我们很高兴宣布 CAP 发布 8.1 版本正式版,我们在这个版本中主要是添加了一些新的配置项支持,并且根据用户反馈做了一些功能调整,同时在这个版本开始默认禁用了从7.2版本引入的并行发布消息。
下面,具体看一下我们新版本的功能吧。
总览
可能有些人还不知道 CAP 是什么,老规矩来一个简介。
CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为 EventBus 使用,该项目诞生于2016年,目前在 Github 已经有超过 6400+ Star 和 110+ 贡献者,以及在 NuGet超 700 万的下载量,并在越来越多公司的和项目中得到应用。
如果你想对 CAP 更多了解,请查看我们的 官方文档。
本次在 CAP 8.1 版本中我们主要带来了以下新特性:
- 新增支持 EnablePublishParallelSend 配置项
- 允许Mongo启用事务时指定Session Handle
- 过滤器上下文参数添加 MediumMessage
- 异步开启事务发送消息API
- AzureServiceBus 支持配置 Correlation header
- PostgreSql 中使用 DataSource 配置连接
- NATS添加新的配置项
- 破坏性改动
- 移除 NATS DeliverPolicy 配置项
- 发布消息默认行为调整为串行发布
新增支持 EnablePublishParallelSend 配置项
我们在7.2版本中,添加了消息发布任务由.NET线程池管理的功能,这个特性在发送侧默认启用。由于.NET线程池中执行任务是并行执行的这并不会保证任务的执行顺序,所以这会导致一个问题就是在某些场景中用户希望串行发送保证消息以保证顺序,使用线程池的话无法保证做到这一点。
所以我们在这个版本中恢复了串行发送消息的默认行为,并提供了新的配置项 EnablePublishParallelSend
来开启并行发送消息。
BTW, 消费侧同样引入了线程池,同样没有默认开启,可以通过 EnableConsumerPrefetch
来启用,这样所有的消费者都将并行执行。
添加 Mongo 启用事务时指定 SessionHandle 扩展
在这个版本中,我们添加了一个新的重载允许使用Mongo存储在开启事务时,传递 IClientSessionHandle
参数。IClientSessionHandle
相当于关系数据库中的 DbTransaction,这在你想精确控制事务的场景提供更多灵活性。
cs
public static IClientSessionHandle StartTransaction(this IMongoClient _,
IClientSessionHandle clientSessionHandle,
ICapPublisher publisher, bool autoCommit = false)
{
// 。。。
}
感谢 @shkarface 对此做出的贡献。
过滤器上下文参数添加 MediumMessage 允许更多可能性
我们在过滤器上下文 ConsumerContext
中,添加了新的 MediumMessage
参数对象。 MediumMessage
这个对象是CAP内部用于和数据库进行映射的对象,一般用户不需要关心。
在这个版本中,我们添加此参数的主要原因是用户可以通过此参数来对消费者执行过程进行更多控制行为,例如可以根据已完成重试来控制重试次数或者在某些情况禁用重试等。
感谢 @bschwehn 对此做出的贡献。
异步开启事务发送消息API
ICapPublisher
接口中的 Transaction
对象现在不再由 AsyncLocal<T>
进行包装,而是直接是 ICapTransaction
对象,受影响的地方为自定义事务扩展方法。只需简单的将 publisher.Transaction.Value =xxx
修改为 publisher.Transaction= xxx
即可。
我们在本版本重新支持了异步开始事务的拓展方法支持 BeginTransactionAsync
,以下是简单示例。
cs
using (var connection = new MySqlConnection(ConnectionString))
{
using var transaction = await connection.BeginTransactionAsync(_capBus, true);
await connection.ExecuteAsync("insert into test(name) values('test')", transaction: (IDbTransaction)transaction.DbTransaction);
await _capBus.PublishAsync("sample.rabbitmq.mysql", DateTime.Now);
}
Azure ServiceBus 支持配置 correlation header
我们为AzureServiceBus添加了新的支持选项 DefaultCorrelationHeaders
,该配置项允许用户设置 correlation过滤器,你可以在这里查看详细信息。
感谢 @demorgi 对此做出的贡献。
PostgreSql 中使用新的 NpgsqlDataSource 配置项以支持动态密码
由于在Postgres中直接使用 Connection 连接字符串不支持设置动态密码,在一些情况下为了安全需要定期更新密码,所以为了支持这个功能,我们支持了使用
来配置数据库连接,来支持动态更新密码。
同时使用 NpgsqlDataSource 来配置数据库连接也是 NpgSql 8.0 版本后的推荐做法。
感谢 @jonekdahl 对此做出的贡献。
NATS 添加新的配置项
我们为 NATS 提供了新的配置项允许更加精细的控制在创建 Consumer 连接时候的选项,下面的新增的2个配置项。
StreamOptions
用于创建 Stream 时指定的设置项, Stream相当于是消息的存储介质,你可能在创建的时候设置持续时间、大小、副本等,你可能在这里查看更多可能的配置项。
ConsumerOptions
用于指定消费者创建时的相关参数,你可以在这里查看更多可能的配置项。
破坏性改动
移除 NATS DeliverPolicy 配置项
由于 NATS 添加了新的配置项,所以原本归属于 ConsumerOptions中的配置项已经被移除。你可以通过ConsumerOptions来设置。
发布消息默认行为调整为串行发布
从 7.2 版开始,为了提高发布方面的性能,我们让 .NET 线程池负责处理消息发布。不过,由于线程池中的任务不能保证按顺序执行,而且确保线性发布在某些用例中很有意义,因此我们将从本版本开始恢复线性发布。
同时,我们还引入了一个新选项 EnablePublishParallelSend
,允许用户启用并行消息发送功能。
总结
以上,就是本版本我们做出的一些新特性和改动,感谢大家的支持,我们很开心能够帮助到大家 。
大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。😃
如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
本文地址:http://www.cnblogs.com/savorboard/p/cap-8-1.html
作者博客:Savorboard