.NET Core中的RabbitMQ消费者CPU高,竟然是这个原因

网站建设2年前发布
17 00

在 RabbitMQ 中有一个 vhsot 机制,可以用来做租户隔离,当产品从单租户演化为多租户时,正好可以用到这个特性,不同 vhost 中的交换机、队列互不影响。,起初在产品中引入 RabbitMQ 的时候,版本如下:,通过一段时间的努力,产品终于支持多租户模式了,测试在做测试的时候发现了一个问题,随着租户数添加的越来越多,RabbitMQ 消费者的 CPU 占用也越来越高。,100 左右的租户数,每个租户队列大概 10 几个,这时 CPU 占用稳定在 50% 左右,即使系统没有任何人访问。,分析下可能的原因:,正式进入问题的排查。,1、在 .NET Core 3.1 中编写一个简单的 RabbitMQ 示例:,2、监听的代码如下:,3、上面代码创建了 200 个 vhost ,每个 vhost 中 1 个队列,程序运行后观察 cpu 如下图:,4、在 Subscribe 方法中有创建 Connection 和 CreateModel 方法,如果使用 using 或在方法最后对其进行释放,CPU 会是一个正常的状态,但消息也就接收不到了。,1、在 RabbitMQ 中有两个参数 MQHeartBeat、MQNetworkRecoveryInterval :,2、不断调整这两个参数的值,进行尝试,发现 CPU 并没有明显改善。,当没有什么头绪的时候,就会采用各种方式进行尝试,来排除问题,所以决定用 Java 试试。,在 Java 程序中,使用的 RabbitMQ 客户端为 rabbitmq-java-client ,版本为 5.14.2 ,因为之前在 .NET 程序验证时已经创建了 vhost ,所以在 Java 程序中只写了消费者进行监听。,当 Java 程序跑起来的时候,发现 CPU 占用是正常的,在遍历 vhost 监听的过程中 CPU 有所波动,遍历完后 ,CPU 占用比较稳定。,这时基本可以确定,是 .NET Core 的 RabbitMQ 客户端的问题,到这时才想起有可能是 .NET Core  RabbitMQ 客户端的版本问题,检查发现目前使用的版本是 5.1.2,而最新的版本为 6.3.0 。,升级 .NET Core RabbitMQ 到最新版本,升级后有两个地方不兼容:,修改这两处后,赶紧运行进行测试,CPU 终于正常了。,查看了下 RabbitMQ 客户端在 GitHub 上的更新记录,发现在版本 6.2.4 中有修复一个关于连接的 Bug:,又继续将版本回退到 6.2.3 进行测试,问题又能重现了,就更加确定了这个问题是在 6.2.4 中解决了。,现在无论是做项目还是做产品,都会使用很多中间件,这些中间件和相关的库也是在不断地更新迭代的,当我们进行功能迭代的同时,也需要关注这些中间件的发展,在新的版本中提供了什么新特性,修复了什么问题,这给我们是否升级提供依据。

© 版权声明

相关文章