MQTT建立连接后,第一个推送消息,消费者要近一分钟才能收到消息,请问这个时间可以调整不?

环境信息

  • EMQX 版本:docker 4.4.10 免费版
  • 操作系统及版本:centeros7
  • 其他

问题描述

MQTT建立连接后,第一个推送消息,消费者要近一分钟才能收到消息,非常慢,继续推送的华,消息可以立即接收到!请问刚建立连接后,推送消息到客户端的时间可以调整不? 因为测试人员在验证消息推送这块,反馈消息不能立即送达

配置文件及日志

1 个赞

如果发布端与订阅端都在线的话这个是不正常的,正常情况消息应当立即投递。

请检查是否有插件或功能阻塞了消息投递,或者开启 debug 模式后,查看一下这个过程中的日志。

1、正常启动emqx
2、采用mqttBOX客户端验证的,相当同时生成一个生产者和消费者,这样可以很清楚的看到,消息要过很长时间才能到达

3、同时docker启动的,不应该是bug模式

请开启 debug 模式并提供一下日志

你好,

按照文档,在emqx.conf配置如下日志:
image

重启dockers后,并发送消息后,在对应的log文件夹下没有找到日志文件

请问:如何正确开启debug模式?

另外测试发现:每次发送消息后,大约11秒才能收到消息,请确认下这个时间延迟是否正常?

好像有一个延迟模块,默认是开启的!但是docker4.4.10免费版,不知道如何关闭,请协助下,感谢!

延迟发布在模块中,但也要主题带 $delayed/{time} 前缀才会启用的

Java客户端代码参考:
springboot当中使用EMQX(MQTT协议) - 代码天地 这个博客,看上去应该也是你们公司人员写的;

通过postman调用接口,从controller入口开始记时,到发送回调接口中的deliveryComplete方法中测试验证,平均程序耗时:大于在400毫秒,如图:

消费端端通过mqttBox接收消息:平均耗时11秒多,
如图:

这样看来,消息从发送,到接收消费需要11+秒的时间,

请问这个有什么办法处理没有啊?

你好,请问你有使用什么鉴权服务吗?

有鉴权,采用的是emqx_auth_http.conf 这组件的http接口鉴权,都是同一个网络段内!用户登录后执行的发送消息和接收消息的,按理说应该没有关系!

我可以关闭下这个鉴权,在验证下

或者鉴权开通后,是不是还有其他配置需要调整?

你好!
重新安装docker容器后,保持默认配置,通过postman测试,可以理解获取到消息!
而以前在配置文件中修改内容如下:
1、在emqx.conf配置文件中,配置:allow_anonymous = false;用户要密码登录

2、在emqx_auth_http.conf配置文件中,重新配置:auth.http.auth_req.url = http://127.0.0.1:80/mqtt/auth,指向自己的服务器api接口i

3、在 emqx_web_hook.conf配置文件中,重新配置参数:web.hook.url = http://127.0.0.1:80,指向自己的服务器API接口,
并配置两个参数:如下
web.hook.rule.client.connected.1 = {“action”: “on_client_connected”}
web.hook.rule.client.disconnected.1 = {“action”: “on_client_disconnected”}
以此收集设备 在线状态

其他在无配置!

请帮助看配置是否有问题,要处理处理才不影响消息及时到达!
感谢 !!!

那应该就是你的 HTTP 服务响应太慢了导致的,所以第一次发布消息很慢,然后第二次发布因为已经有了 ACL 缓存不用再次请求 HTTP 服务就很快。

不是鉴权导致的,昨天也验证后没有查到原因,删除docker容器后从安装后,一切都有默认的验证才可以的。所以决定今天一步一步的配置验证,看问题处在哪里里!

1、在emqx.conf配置文件中,没有查到allow_anonymous 的配置;
只有在emqx.conf里面加上allow_anonymous = false后,重启docker后,但还是可以匿名登录;
如下图:
image

有点诡异了

下图是任意账号登录成功:

原因查明:
开启鉴权插件就出现消息11+秒才能到达!
请问哪个版本这方面有改善的?我们需要独立鉴权!

我们服务真实鉴权时间非常短 33毫米
如下图

下图是开启的鉴权插件:

##--------------------------------------------------------------------
## Authentication/Access Control
##--------------------------------------------------------------------

## Allow anonymous authentication by default if no auth plugins loaded.
## Notice: Disable the option in production deployment!
##
## Configured to `false_quick_deny` means quick deny of anonymous clients
## (without username). So the auth backend checks can be skipped.
##
## Value: true | false | false_quick_deny
allow_anonymous = true

你看下 emqx.conf 中大概 660 行的位置,应该默认有这个配置项的才对。

以及你的 etc 目录是否有持久化?

你的 EMQX 和 HTTP 服务是部署在同一个局域网内吗?看下是否是网络延迟过长。

都是同一个网络,开发环境,不会出现网络延迟!这个你们本地应该时非常容易再现的

建议抓包看下延迟是发生在哪个环节上。

刚才测试了,只需要开启鉴权插件,指向任意一个接口鉴权,就可以再现了!你们可以在本地验证看下,你们更专业,处理起来也更快捷高效!