RabbitMQ使用以及优化

RabbitMQ使用以及优化

背景说明

项目中需要异步回调客户(具体实现参考rabbitmq死信),客户端收到回调需返回字符串success,否则,会采用梯度回调:分别于0,5,10,30,60分钟后进行回调,5次回调未返回success,记录回调失败;

问题描述

  • rabbitmq延迟队列中消息已经过期,却未路由分发到指定队列。

  • 举例说明:

消息1 过期时间一小时,先进入延迟队列;

消息2 过期时间五分钟,后进入延迟队列;

五分钟后,消息2过期了,消息1 没有过期,消息2不会被路由到指定队列

分析

  • 原因:rabbitmq延迟队列中消息被路由到指定队列需满足两个条件:

    • 已经过期
    • 消息位于延迟队列头部

解决

  • 官方相关说明

Messages which should expire will still only expire from the head of the queue. This means that unlike with normal queues, even per-queue TTL can lead to expired lower-priority messages getting stuck behind non-expired higher priority ones. These messages will never be delivered, but they will appear in queue statistics.

Queues which have a max-length set will, as usual, drop messages from the head of the queue to enforce the limit. This means that higher priority messages might be dropped to make way for lower priority ones, which might not be what you would expect.

看到官网文档说明之后,消息是有优先级的,我就设想:针对不同过期时间消息,进行消息优先级设置(数字越大,优先级越高,亲测可行),于是就按照此方案进行修改代码。修改完成测试发现,结果和预期不一致。

经研究发现,对延迟队列(或者叫死信)中的消息设置优先级是不起作用的,延迟队列中的消息想被路由到指定队列,一是需要到达过期时间,而是需要在队列的头部,这样才能被扫描到,单纯设置消息优先级,是不可行的。

于是,我又想到了其他方案,放入延迟队列的消息,过期时间统一设置5分钟,针对10,30,60分钟过期时间的消息,可以增加消息的轮询次数,未达到指定轮询次数的消息,过期之后继续放入延迟队列,这样就达到了期望的目的。

核心思想

  • 对延迟队列中的消息设置消息优先级是不起作用的。
  • 可以通过消息回调次数 + 消息轮询次数达到梯度回调客户的目的。
RabbitMQ的配置文件可以通过一些优化来提高其性能和稳定性,以下是一些常见的配置文件优化建议: 1. 内存管理:在RabbitMQ的配置文件中,可以通过设置“vm_memory_high_watermark”和“vm_memory_high_watermark_paging_ratio”参数,来管理RabbitMQ使用的内存。这些参数可以帮助提高RabbitMQ的性能和稳定性。 2. 消息存储:RabbitMQ的消息可以存储在磁盘上,因此在配置文件中可以设置“disk_free_limit”参数,来控制磁盘空间的使用。同时,也可以设置“queue_mode”参数,来选择队列的持久化方式,以提高性能和稳定性。 3. 网络配置:RabbitMQ的网络配置可以通过设置“tcp_listen_options”和“tcp_listen_timeout”参数来优化。其中,“tcp_listen_options”参数可以设置网络连接的选项,如TCP接收缓冲区大小等;“tcp_listen_timeout”参数可以设置网络连接的超时时间。 4. 集群配置:如果使用RabbitMQ集群,可以通过设置“cluster_partition_handling”参数来处理网络分区和集群节点的故障。同时,也可以设置“queue_master_locator”参数来选择队列的主节点,以提高性能和稳定性。 总的来说,通过优化RabbitMQ的配置文件,可以提高其性能和稳定性,从而更好地满足业务需求。但是需要注意,在进行配置文件优化时,应该根据具体的业务需求和硬件环境,选择合适的参数值,以达到最佳的性能和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值