RabbitMQ心跳

1、现象:
生产环境日志突然报警:
"message":"Broken pipe or closed connection","file":"/opt/app/vendor-new/php-amqplib/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php"
意思是管道破坏或者连接关闭
2、问题定位:
通过报警日志判断是RabbitMQ出了问题
3、case原因:
消费者执行时间过长(超出心跳的2倍时长),被消费的消息一直没有确认,服务端认为消费者已经死掉了。
4、关于rabbitMQ心跳:
心跳超时间隔
心跳 timeout 值决定了 TCP 相互连接的最大时间,超过这个时间,该连接将被 RabbitMQ 和 客户端当作不可到达。这个值是在 RabbitMQ 服务器和客户端连接的时候协商的。客户端需要配置请求心跳检测。RabbotMQ 3.0 及以上的版本中,RabbitMQ 默认设置与客户端之间的心跳时长为 60 秒(3.5.5 版本之前的默认值为 580)。
心跳帧每隔 timeout/2 时间会发送一次。连续两次心跳失败后,连接将会当作不可到达。不同客户端对此的表现不同,但是 TCP 连接都会关闭。当客户端检测到 RabbitMQ 服务节点不可到达,它需要重新发起连接。
任何连接数据交换(例如 协议操作、发布消息、消息确认)都会计入有效的心跳。客户端可能也会发送心跳包,在连接中有其他数据交换,但有些只在需要时发送心跳包。
可以设置 timeout 为 0 来禁用心跳检测功能。不推荐这么做。
低超时间隔和误报
设置心跳 timeout 时长过段会导致误报(正常的客户端连接会被误报为不可到达)。可能会因为瞬间的网络拥堵、短暂的服务器流量控制,或者其他原因。在设置 timeout 值时需要考虑这些因素。
用户和客户端包维护者多年的反馈建议。timeout 值小于 5 秒很可能导致误报,小于等于 1 秒更有可能误报,在 5 到 20 之间是大多数环境适合的值。
同时心跳也不建议设置太高,如果设置太高说明消费的时间过长,这类业务处理则不太适合在MQ中做处理。


作者:知行研发部--刘学千

发布于 2019-12-02 19:58