消息处理时回应客户端ack,等待来自服务器的响应时超时 (32000)

环境信息

  • EMQ X 版本:4.3.3
  • 操作系统及版本:Linux localhost.localdomain 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  • 其他

问题描述

messageArrived方法里publish一个新的主题回应客户端,一直报【等待来自服务器的响应时超时 (32000)

配置文件及日志

消费的太慢导致的队列满了,看起来像是你做的业务有死循环。检查一下Java代码的业务模式。

超时也是队列满了导致的吗

正常情况下是没有问题的,压测时会出现这个问题

消费端能力不足,你压测有订阅者吗?看下是不是消费端性能不够,或者消费端的能力不够。可以加一些消费数量。

压测的时候是有订阅者的,场景是:客户端往A主题发消息,服务端订阅了A主题,服务端收到A主题的消息后往B主题发消息告知,客户端订阅B主题。报错 【等待来自服务器的响应时超时 (32000) 】出现在服务端往B主题发消息的的时候

是同一个客户端同时订阅了A和B吗?

如果是同时订阅了A和B,会产生死循环,A主题的消息消费过程中在B主题中生产了消息,但是A主题的消息还没有消费完成,B主题又堵塞在消息队列中消费不下去。推荐使用不同的终端订阅AB主题。一个生产组一个消费组

不是同一个客户端同时订阅A和B主题。

客户端A订阅B主题,客户端B订阅了A主题;
客户端A往A主题发消息,客户端B收到A主题的消息后往B主题发消息告知,
报错 【等待来自服务器的响应时超时 (32000) 】
出现在客户端B往B主题发消息的的时候

非常可能是B主题的消费能力不足,建议提高一下B主题的消费端能力。
PS:不推荐使用从一个主题消费时在另一个主题生产这种模式,可以使用 exhook 或者 webhook 之类的方式,挂载 message.delivered 或者 message.delivered 钩子。 参考文档

感谢,感谢

你好,想请问这种情况,如果QOS 为0的话,也会影响吗

QoS 0 可以减少客户端在协议报文往来的压力,但是仍然会产生业务压力,消费能力不足还是不行。