CAP 8.2 版本发布通告
前言
今天我们很高兴宣布 CAP 发布 8.2 版本正式版,我们在这个版本中主要致力于对订阅着并行执行的特性提供支持,同时添加了对在订阅者中对消息头的控制行为。
下面,具体看一下我们新版本的功能吧。
总览
可能有些人还不知道 CAP 是什么,老规矩来一个简介。
CAP 是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案(https://github.com/dotnetcore/CAP)同样可以用来作为 EventBus 使用,该项目诞生于2016年,目前在 Github 已经有超过 6500+ Star 和 110+ 贡献者,以及在 NuGet超 800 万的下载量,并在越来越多公司的和项目中得到应用。
如果你想对 CAP 更多了解,请查看我们的 官方文档。
本次在 CAP 8.2 版本中我们主要带来了以下新特性:
- 支持消费者独立并行执行
- CapHeader 添加更多行为来控制回调
- 改进当启用 EnablePublishParallelSend 时默认的调度行为
- 为 NATS 支持 CustomHeadersBuilder 配置项
- 其他改进
支持消费者独立并行执行
在介绍这个新特性之前, 我们先来看看过去如果想让消费者独立执行应该怎么做。
熟悉 CAP 的同学可能了解到,CAP提供了一个 UseDispatchingPerGroup 配置项用来为消费者组启用独立的调度器,独立的调度器意味着其具有独立的消费管道,这样消费者组之间就不会互相影响(默认如果不开启此配置项会将不同组的消息放置到同一管道来调度并串行执行),从而可以实现如某些消费者执行非常长的时间也不会卡住另外一些执行时间比较短消费者,这样也就做到了独立执行。
当然,如果想开启多个线程并发执行,可以通过设置 SubscriberParallelExecuteThreadCount 配置项来启用多个执行线程执行,这会提高消息的消费速度。
可以看到,在过去是不支持为消费者设置独立的并行度的,SubscriberParallelExecuteThreadCount 其提供的是全局配置,不支持独立为订阅者进行设置。
以上都是过去的行为,下面我们看一下现在如何做。
在新版本中,我们为 [CapSubscribe] 这个 Attribute 添加了一个新的参数 GroupConcurrent 来为订阅着设置并行度,也就是说每一个组/订阅者都可以独立设置,设置之后他们之间互不影响,独立执行。
下面我们来看一个示例,定义消费者如下
[CapSubscribe("hello")]
public void Hello1(){
Console.WriteLine("hello 1");
}
[CapSubscribe("hello", Group = "foo", GroupConcurrent = 2)]
public void Hello2(){
Console.WriteLine("hello 2");
Thread.Sleep(1000);
}
[CapSubscribe("hello", GroupConcurrent = 2)]
public void Hello3(){
Console.WriteLine("hello 3");
Thread.Sleep(1000);
}
为了验证 Hello2 和 Hello3 的执行,我添加了 Thread.Sleep(1000);这2行代码。
现在,发送一条名为hello的消息,我们来看一下订阅者是如何执行的。
await cap.PublishAsync<string>("hello", null);
熟悉CAP的同学可能知道,在过去 Hello1 和 Hello2 是都会执行,如果启用了 UseDispatchingPerGroup 配置项,那么会同时执行,否则会串行执行。
在新版本,我们来看看是怎么执行的。
先看 Hello2 ,新添加了 GroupConcurrent 参数,会是什么效果呢? 正如和前面说过的,这是一个消费并行度参数,在 Hello2中设置为 2 那么就代表这个方法在有新消息到达时候,最多会有2个线程在同时执行它。所以此处的打印结果会是同时打印2个 hello 2。
再来看 Hello1 和 Hello3 ,这两个哪个会打印呢? 其实这两个也都会打印出来,那么他们两个有什么区别呢?
可以看到的是一个添加了 GroupConcurrent ,另外一个没添加。所以我来解释一下,在内部,我们会检测如果一个订阅者添加了 GroupConcurrent 而没有指定 Group 的话,那么我们会认为其需要独立执行,此时我们会自动采用订阅名称为其生成默认 Group 名称,在此示例中就相当于设置了 Group="hello"。
这就说完了,整体来说是不是很简单,需要就设置,不需要就不设置,没有复杂的配置。
所以新版本我们移除了 UseDispatchingPerGroup 配置项,如你所见这已经是默认行为。
PS: 如果将多个订阅者设置为同一组,并且还为这些订阅者设置了 GroupConcurrent 值,则只有第一个订阅者设置的值才会生效。
PS: GroupConcurrent 在 RabbitMQ 中会自动对应设置Qos,无需再手动干预。
CapHeader 添加更多行为来控制补偿事务
在发布消息的时候,我们支持指定 callbackName 参数来进行补偿事务,消费者执行完成后 CAP 会自动调用 callbackName 来回调执行补偿方法。
接收到用户的反馈,在某些场景下,消费者可能执行成功就不需要再回调发布方,那么此时消费者就需要控制补偿行为来避免回调,再或者想回调另外一个方法来执行其他的补偿流程。
在过去可能需要通过消费过滤器来实现,现在我们为 CapHeader 提供了更多的行为来实现这一目的。下面来看一下,要说的话都在代码里。
[CapSubscribe("place.order.qty.deducted")]
public object DeductProductQty(JsonElement param, [FromCap] CapHeader header)
{
var orderId = param.GetProperty("OrderId").GetInt32();
var productId = param.GetProperty("ProductId").GetInt32();
var qty = param.GetProperty("Qty").GetInt32();
// 添加额外的头信息到响应消息中
header.AddResponseHeader("some-message-info", "this is the test");
// 或再次添加补偿的回调
header.AddResponseHeader(DotNetCore.CAP.Messages.Headers.CallbackName, "place.order.qty.deducted-callback");
// 如果你不再遵从发送着指定的回调,想修改回调,可通过 RewriteCallback 方法修改。
header.RewriteCallback("new-callback-name");
// 如果你想终止/停止,或不再给发送方响应,调用 RemoveCallback 来移除回调。
header.RemoveCallback();
return new { OrderId = orderId, IsSuccess = true };
}
改进启用 EnablePublishParallelSend 时默认调度行为
在发布消息时,我们支持使用 EnablePublishParallelSend 来启用并行发送,因为发布消息属于 short-term 的task,所以非常放置到 .NET 线程池执行。
这本身没有问题,在过去我们进行过压力测试也没有发现问题,但是零星用户反馈会导致应用崩溃,询问也没有反馈更多信息(PS: 大家提交完 issue 不是就代表不用管了,还请关注后续),暂时还得不到更多消息是否是 Docker 限制了内存或CPU导致的,不得而知。
无论如何,我们在这个版本优化了这一行为,现在会分批次来将任务提交到线程池,在上一批次执行完成后才会放置下一批次的任务。如果发布速度很快,内存队列达到阈值也就是堆满后,会启用背压机制来延缓发布者的响应。
为 NATS 支持 CustomHeadersBuilder 配置项
现在 NATS 也有了 CustomHeadersBuilder 配置项,用于和三方异构系统做对接。没有太多好说的,和其他 Transport 的用法都是一致。
其他改进
升级 Npgsql 到最新版本
安全性升级,Npgsql 易受通过协议信息大小溢出进行 SQL 注入。
https://github.com/npgsql/npgsql/security/advisories/GHSA-x9vc-6hfv-hg8c
升级 Dashboard npm包到最新次要版本
修复 NATS重启后健康检查偶尔未正确恢复的问题
参考 Issue #1542
总结
以上,就是本版本我们做出的一些新特性和改动,感谢大家的支持,我们很开心能够帮助到大家 。
大家在使用的过程中遇到问题希望也能够积极的反馈,帮助CAP变得越来越好。
如果你喜欢这个项目,可以通过下面的连接点击 Star 给我们支持。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
本文地址:http://www.cnblogs.com/savorboard/p/cap-8-2.html
作者博客:Savorboard
本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
CAP 8.2 版本发布通告的更多相关文章
- CAP 2.6 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 2.6 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star. 自从上次 CAP 2.5 版本发布 以来,已经过去了几 ...
- CAP 3.0 版本发布通告
前言 大家好,我们很高兴宣布 CAP 发布了 3.0 版本正式版. 自从上次 CAP 2.6 版本发布 以来,已经过去了几个月的时间,关注的朋友可能知道,在这几个月的时间里,也发布了几个预览版的 3. ...
- CAP 3.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...
- CAP 5.0 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 5.0 版本正式版.同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行. 在 5.0 版本中,我们主要致力于更好的支持 .NET 5 以 ...
- CAP 5.1 版本发布通告 - 你期待的 Redis 来了
前言 今天,我们很高兴宣布 CAP 发布 5.1 版本正式版,在这个版本里我们同样引入了更多令人激动的新特性和改进,同时也得到越来越多人的喜爱. 得益于社区的反馈和贡献者的支持,在过去的两个月里,我们 ...
- CAP 5.2 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 5.2 版本正式版,在这个版本中,我们主要致力于更好的优化使用体验以及支持新的 Transport,同时在该版本也进行了一些 bug 修复的工作. 自从 5. ...
- CAP 6.0 版本发布通告 - 支持 OpenTelemetry
前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...
- CAP 6.1 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性. 那么,接下来我们具体看一下吧. 总览 可能有些人还不知 ...
- CAP 6.2 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 6.2 版本正式版,在这个版本中我们主要做了一些功能优化,以及针对目前已经发现的几个 BUG 进行了修复了. 那么,接下来我们具体看一下吧. 总览 可能有些人 ...
- CAP 7.0 版本发布通告 - 支持延迟消息,性能炸了?
前言 今天,我们很高兴宣布 CAP 发布 7.0 版本正式版,我们在这个版本中带来了大批新特性以及对性能的优化和改进. 自从今年 1月份发布 6.0 版本以来,已经过去了快1年的时间.在过去的将近1年 ...
随机推荐
- await this.$nextTick()和this.$nextTick(callback)有什么区别?记一次bug调试
背景 需要实现一个需求,一个小区业务详情页面,在左侧菜单栏切换了小区后,详情页跟着切换. 这个详情页面是根据url上的/:id来确定小区id的,所以切换了小区后,应该切换路由. 于是这样实现: wat ...
- VUE中具名插槽和匿名插槽的使用
在我的项目中由于使用的是vue+element一个自用框架进行开发,插槽用法相较简单 比如在列表字段columns使用slotname即可 <template v-slot:_spec=&quo ...
- [python] 基于PyWaffle库绘制华夫饼图
华夫饼图Waffle chart是一种独特而直观的图表,用于表示分类数据.它采用网格状排列的等大小方格或矩形,每个方格或矩形分配不同的颜色或阴影来表示不同的类别.这种可视化方法有效地传达了每个类别在整 ...
- 检索增强生成RAG-书生浦语大模型实战营学习笔记3&大语言模型8
大语言模型学习-8.检索增强生成RAG 书生浦语大模型实战营学习笔记3 本文主要涉及检索增强生成相关基础知识,也包括第二期实战营的第3课的内容 动机 当今大语言模型存在幻觉现象,即大模型会无意义或不忠 ...
- Linux grep根据关键字匹配前后几行
在Linux环境下,查看文件内容时,很多时候需要查看指定关键字的前后几行,如查看日志文件时,如果日志文件太大,想直接在Linux 终端中查看,可以grep 'partten' filename 进行过 ...
- 应急响应web1
应急响应的过程 目的:分析攻击时间.攻击操作.攻击结果.安全修复等并给出合理的解决方案. 保护阶段:直接断网,保护现场,看是否能够恢复数据: 分析阶段:对入侵过程进行分析,常见的方法为指纹库搜索.日志 ...
- ip地址、子网掩码、网关、dns简介
IP地址IPADDR: IP地址是唯一的标识,是一段网络编码(二进制),由32位组成. IP 是 Internet Protocol(网际互连协议)的缩写,是 TCP/IP 体系中的网络层协议. IP ...
- GPS坐标、火星坐标、百度坐标之间的转换--提供java版本转换代码
参考文章:https://www.jianshu.com/p/c39a2c72dc65?from=singlemessage 1.国内几种常用坐标系说明 (1)名词解释 坐标系统:用于定位的系统,就跟 ...
- C++ 资源大全:标准库、Web框架、人工智能等 | 最全整理
C++ 资源列表,内容包括: 标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等 目录 进程间通信 Json 日志 机器学习 数学 内存分配 多媒体 网络 PDF 物理学 ...
- 字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问. 锁的作用主要体现在以下几个方面: 互斥访问:确保在任何时刻,只有一个 ...