emqx的Keep alive

在 MQTT 协议和 EMQX 的默认设置中,Keep Alive(心跳间隔) 的数值取决于客户端的设置,但服务端(EMQX)也有相应的默认保护机制:

1. 客户端默认值

  • 标准默认值 :大多数 MQTT 客户端库(如 Paho, MQTT.js, Mosquitto)通常将默认 Keep Alive 设置为 60 秒

  • 协议要求 :Keep Alive 是由客户端在 CONNECT 报文中指定的。如果设置为 0,则表示禁用心跳机制,连接将永远不会因为不活跃而被服务端断开。

2. EMQX 服务端配置

EMQX 允许通过配置文件(emqx.conf)来规范或强制修改客户端的行为,防止客户端设置不合理的参数:

  • 最大 Keep Alive(Max Keep Alive)

    默认通常为 不限制。但你可以配置一个上限,如果客户端请求的时间超过此值,EMQX 会强制将其降低。

  • 心跳后退系数(Backoff Multier)

    EMQX 默认遵循协议标准,采用 1.5 倍 的宽限期。

    公式超时时间 = \\text{Keep Alive} \\times 1.5

    例如:如果客户端设置 Keep Alive 为 60s,EMQX 会在 90s 内没有收到任何包时才判定为掉线。


3. 如何选择合适的时间?

设置 Keep Alive 需要在实时性资源消耗之间平衡:


注意事项:TCP Keep-Alive vs MQTT Keep-Alive

很多人会混淆这两者:

  • MQTT Keep-Alive (应用层):由 EMQX 进程维护,通过 PINGREQ 包实现,推荐使用

  • TCP Keep-Alive(传输层):由操作系统内核维护。EMQX 默认也启用了 TCP Keep-Alive(通常是 2 小时后才开始探测),它更多是作为网络底层的最后一道防线。

配置建议: 如果你发现设备明明断电了,但 EMQX 后台还显示"在线",通常是因为 Keep Alive 设置得太长 或者是由于 网络中间件(如防火墙)拦截了断开信号,此时缩短 Keep Alive 时间是最有效的办法。

官方文档地址:https://www.emqx.com/zh/blog/mqtt-keep-alive

相关推荐
像我这样帅的人丶你还8 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩8 小时前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia9 小时前
Mybatis的日志输入
java
亦暖筑序10 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户2986985301413 小时前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao14 小时前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿14 小时前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰67514 小时前
字节跳动国际支付-后端开发-三面面经
java
Flittly14 小时前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
RainCity15 小时前
Java Swing 自定义组件库分享(十二)
java·笔记·后端