MQTT 客户端出现连接订阅等问题时如何排查?

这篇具有很好参考价值的文章主要介绍了MQTT 客户端出现连接订阅等问题时如何排查?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,这是一期社区专题 FAQ。我们整理了近期社区中关注度较高的问题,在这里进行统一汇总解答。

今后本系列内容将不定期推送,敬请关注。

同时,如果大家在使用 EMQX 的过程中遇到问题,欢迎通过以下方式进行解决:

  • 查阅 EMQX 产品文档与博客文章。
  • 如果在现有资料中未能查询到问题的解决办法,可以在问答社区中留言提问,我们会尽快解答您的问题。

Q:向 MQTT Broker 发布多条消息,MQTT Broker 向订阅者转发这些消息的时候能否保证原始顺序?

MQTT Broker 一定会保证来自同一客户端的相同主题的消息按照到达顺序被转发,这与消息的 QoS 等级无关,QoS 等级不会影响转发顺序,不管是消息丢失,还是消息重复,也都不会导致消息失序。

对于不同主题的消息,MQTT Broker 不会提供转发顺序保证,我们可以将他们视为进入了不同的通道,比如主题 A 的消息先于主题 B 的消息到达 MQTT Broker,但最终可能主题 B 的消息会更早下发。

Q:我的客户端无法连接到 EMQX/订阅失败/发布消息但是对端没有收到任何消息,出现这些情况怎么办?

A:其实 EMQX 的 Debug 日志基本已经记录了所有的行为和现象,通过阅读 Debug 日志我们能够知道客户端何时发起了连接,连接时指定了哪些字段,连接是否通过,被拒绝连接的原因是什么等等。但是由于 Debug 日志记录的信息过多,会带来额外的资源消耗,并且不利于我们针对单个客户端或主题进行分析。

所以 EMQX 提供了日志追踪功能,我们可以指定想要追踪的客户端或主题,EMQX 会将所有与该客户端或主题相关的 Debug 日志都输出到指定日志文件中。这样不管是自己分析调试,还是寻求社区帮助,都会方便许多。

Q:为什么会有 Client ID 为 CENSYS 的或者是其他我不认识的客户端?

A:CENSYS 是一款互联网探测扫描工具,它会周期性扫描 IPv4 地址空间,探测 HTTP、SSH、MQTT 等协议的默认端口。所以如果你发现有 Client ID 为 CENSYS 的或者其他未知的客户端接入了你的 MQTT Broker,这意味你目前处于相对较低的安全性保障下。以下措施可以有效帮助你避免这个问题:

  1. 不要使用默认配置,例如 EMQX 用于验证 HTTP API 访问权限的 AppID 与 AppSecret 等
  2. 启用认证,可以是用户名密码认证,也可以是 JWT 认证,避免只需要知道 IP 地址就可以登录的尴尬情况
  3. 启用 TLS 双向认证,只有持有有效证书的客户端才能接入系统
  4. 启用授权,避免非法设备登录后可以获取敏感数据
  5. 配置你的防火墙,尽量关闭一些不需要的端口

Q:EMQX 是一个主题一个消息队列吗?

A:不是。EMQX 中的每个客户端进程都会有一个消息队列,这个消息队列会存储所有因飞行窗口满或连接断开而暂时无法下发给客户端的消息。消息队列有最大长度限制,以避免消息无限制堆积,达到最大长度后,为了使新消息继续入队,EMQX 会陆续丢弃队列中最老的消息。消息队列最大长度由 max_mqueue_len 这个配置项指定。

Q:EMQX 日志中出现 “Parse failed for function_clause” 是什么原因?

A:这个日志表示报文解析失败,可能因为这不是一个 MQTT 报文,我们遇到过很多向 MQTT 端口发送 HTTP 请求的情况,也可能因为报文中包含了非 UTF-8 字符等等。我们可以在这条 “Parse failed…” 日志中检索 Frame data 关键字以查看完整的报文,帮助我们分析解析失败的可能原因。

Q:EMQX 日志中出现 “Context: maximum heap size reached” 是什么原因?

A:出现这个日志通常表示相应的客户端进程已经达到了最大堆栈内存占用限制,之后这个进程就会被 EMQX 强制 Kill。这一机制存在的原因是为了保证 EMQX 的可用性,避免客户端进程的内存占用无限制增长最终导致 EMQX OOM。客户端进程的堆栈占用主要来源于飞行窗口和消息队列中未完成确认或未投递的消息,而这两处消息堆积的主要原因通常是客户端消费能力不足,无法及时处理响应消息。

与此相关的配置项是 force_shutdown_policy,它的配置格式为 <Maximum Message Queue Length>|<Maximum Heap Size>,例如 10000|64MB。其中 <Maximum Heap Size> 就是限制每个客户端进程能够占用的最大堆栈内存。

我们见过一些用户为了不想客户端进程被强制关闭,不去提升客户端的消费能力,而是一味增大 <Maximum Heap Size>,这除了给 EMQX 带来 OOM 风险,也会使得消息的时延增加,往往得不偿失。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/mqtt-client-faq文章来源地址https://www.toymoban.com/news/detail-418932.html

到了这里,关于MQTT 客户端出现连接订阅等问题时如何排查?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • wxbit appinventor 使用MQTT客户端连接onenet时的坑

    在最近使用wxbit中的MQTT客户端时遇见一些小问题,在开始不知道具体怎么连接上自己的onenet产品,后面通过查阅资料解决了问题 写下这篇博客是为了记录相关问题 将mqtt客户端拖入后,点击MQTT客户端,便可以查看组件属性 上图4个属性决定的你连接的是哪个服务器和哪个设备

    2024年02月05日
    浏览(61)
  • SpringBoot集成Milo库实现OPC UA客户端:连接、遍历节点、读取、写入、订阅与批量订阅

    前面我们搭建了一个本地的 PLC 仿真环境,并通过 KEPServerEX6 读取 PLC 上的数据,最后还使用 UAExpert 作为OPC客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能。在这篇文章中,我们将通过 SpringBoot 集成 Milo 库实现一个 OPC UA 客户端,包括连接、遍历节点、读取、写入

    2024年02月09日
    浏览(59)
  • MQTT 客户端自动重连最佳实践|构建可靠 IoT 设备连接

    MQTT 是一个基于 TCP 协议的发布/订阅模型协议,它被广泛应用于物联网、传感器网络和其他低带宽、不稳定网络环境中。在这些网络环境中,网络连接往往不稳定,可能会出现网络故障、信号弱化、丢包等问题,这可能会导致 MQTT 客户端与服务器之间的连接中断。物联网应用

    2024年02月16日
    浏览(38)
  • 手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

            本文将实现:         1、esp32与腾讯云物联网服务器通过mqtt协议通信         2、电脑和手机客户端通过mqtt与腾讯云相通信         3、腾讯云服务器内部消息转发,将手机、电脑发布的主题转发给esp32订阅,实现手机、电脑与esp32的远程通信。      

    2024年02月11日
    浏览(57)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-1 环境搭建

    前端时间做了一个项目,要求在PC端使用QT制作一个客户端,用来接收从单片机上传到Onennet的数据,并且还要下发指令。当时弄了好几天,中途遇见了非常多的问题,所以写下这篇文章记录一下,同时分享一下自己的经验。 我的环境:QT 5.12.6 总结下我遇见的难点: 1,环境配

    2024年02月11日
    浏览(65)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-2 项目开发

    这篇文章主要是分享QT智能家居项目的代码 在我看来,QT MQTT的使用主要难点就是对于环境的搭建,在我们把环境搭建完之后,接下来就是传统手艺了,我们只要知道相应的库函数,调用它,就能实现我们所需要的功能了。 所以,在这里我也只是简单的分享一下我写的第一版

    2024年02月16日
    浏览(44)
  • 通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器

    前面我们搭建了一个本地的 PLC 仿真环境,并通过 KEPServerEX6 读取 PLC 上的数据,最后还使用 UAExpert 作为 OPC 客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能:SpringBoot集成Milo库实现OPC UA客户端:连接、遍历节点、读取、写入、订阅与批量订阅。 注意,如果实际工

    2024年02月16日
    浏览(49)
  • 小米妙享客户端PC 出现打不开的问题

    前几天使用网上分享的小米妙享pc端安装包安装上了,用了几天感觉也都挺好的,平板的镜像,扩展屏幕,也都很好,直到有一天晚上关电脑的时候,所有的应用都没退,直接把电脑关机了,第二天开机的时候,发现小米妙享打不开了(一般小米妙享都设置的开机自启) 用windos自带的应用日

    2024年02月07日
    浏览(205)
  • mqtt安卓客户端

    1.MQTT(消息队列遥测传输协议),是一种基于 发布/订阅 (publish/subscribe)模式的\\\"轻量级\\\"通讯协议, 该协议构建于TCP/IP协议上 。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使

    2024年02月10日
    浏览(44)
  • 通过 EPOLL 解决客户端同时连接多服务器的问题

    项目需求是  程序上 同时配置了多个服务端 设备 每隔一段时间需要 比如1分钟 连一下服务器看下是否连通   并将结果上报给平台  原来是用线程池来做的   具体大概就是 定时器到了之后  遍历设备列表  找到设备之后  通过 socket连接 发送一个指令 等待服务器返回 用来

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包