背景:
公司的一个线上项目运行一段时间后, rabbitmq 消息队列就会出现消费异常, 无法正常消费消息, 每次重启之后, 就可以正常消费了
问题分析
consumer 报错信息
查看 rabbitmq consumer 的报错信息显示
PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn moreover
根据这个报错信息, 百度搜索结果大多都是指向官方的 消息确认超时的间隔, 我不看就知道不是这个原因, 我们那项目我很清楚, 根本没有什么并发, 也没有耗时的后端逻辑, 所以不可能是因为消息积压导致的超时未 ack.
consumer 端优化
结合前几次出现这个问题的情况, 每次都是消息队列服务启动后消费者端正常消费消息, 运行一段时间才出现这个问题, 考虑是不是 consumer 运行一段时间后与rabbitmq服务器端断开了连接, 基于此, 在连接rabbitmq 的时候加上了 heartbeat 心跳检测, 并且在消费者端增加断开连接重连处理, 但是隔一段时间问题仍旧出现
rabbitmq heartbeat 心跳时间, 官方推荐设置为60秒, 每30秒向客户端发送一次心跳包, 如果服务器超过两次没有接收到客户端回应则断开tcp连接
<