rabbitmq的consumer_timeout修改
问题:
项目中使用了rabbitmq来做异步任务,最近突然发现一个耗时比较长的任务一直在重复执行。
排查:
排查日志后发现了超时,channel关闭。如果超过了consumer_timeout时间默认为180000ms后会断开连接,如果是手动ack,会报错PublisherCallbackChannel is closed
分析:
官网有说在目前支持的所有RabbitMQ版本中,在消费者交付确认时强制执行超时。这有助于检测从不确认交付的有bug(卡住)的消费者。这样的消费者会影响节点在磁盘上的数据压缩,并可能导致节点耗尽磁盘空间。
解决:
既然是因为超时原因导致的,那么给超时时间加大就可以了。
1.在etc目录下建一个文件,/etc/rabbitmq.conf,rabbitmq默认不会建这个文件,然后文件里面设置consumer_timeout = 720000(根据需要来决定)。然后重新启动rabbitmq。这种方式会使得rabbitmq短暂不可用不是太友好。
2.直接动态修改,通过 rabbitmqctl eval 'application:set_env(rabbit,consumer_timeout,720000).' 修改。
3. 修改后通过rabbitmqctl eval 'application:get_env(rabbit,consumer_timeout).' 验证。