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

相关推荐
Mr_Macallon1 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
Sweet锦1 小时前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
如意猴2 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_2 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
sunoo-2292 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
专业程序开发源2 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568032 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu2 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
樱花落木兰3 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
HAHAXX83 小时前
电商RPA批量上架通用方案:一套流程如何同时跑通拼多多、抖店、淘宝和跨境平台
java·运维·rpa