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

相关推荐
维天说1 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜1 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane19941 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
你想知道什么?1 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御1 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
谙弆悕博士2 小时前
系统集成项目管理工程师教程(第3版)笔记——第17章:法律法规和标准规范
笔记·职场和发展·学习方法·业界资讯·软考·法律·法规
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品2 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘2 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
AOwhisky3 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发