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

相关推荐
IT枫斗者枫哥几秒前
CompletableFuture失败后返回空列表:异常没了,业务含义也变了
java·后端
憧憬成为java架构高手的小白5 分钟前
langgraph4j学习
学习
江屿风11 分钟前
【Plain Language Large Model】【从浏览器到全栈:一课精通Node.js三剑客】流食般投喂
笔记·前端框架·npm·node.js·js·npx
知识搬运临时工12 分钟前
一个模板把 AEM 拖进 Full GC 死亡螺旋:300% CPU、7 GB 堆、310 万行堆栈
java·aws
CCIE-Yasuo14 分钟前
网络安全-学习web开发-列表、标签
前端·学习·web安全
用户4329359280515 分钟前
CoAP还是MQTT:1万只Cat.1水表三个月带宽续航实测
java
一只大鸽子17 分钟前
游戏开发笔记0-Godot启动
笔记·游戏引擎·godot
知守观26 分钟前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
旖旎夜光37 分钟前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
Java成神之路-41 分钟前
Java String 为什么不可变?和 HashMap 到底有什么关系?
java