无消息堆积时,未连接的客户端不会被删除。
客户端被删除了具体是指什么操作?
客户端列表页 找不到该会话。刷新之前打开的客户端详情页,提示“该客户端不存在”。
没有做任何操作,感觉是mqtt服务删除了该会话,表象是:客户端列表页 找不到该未连接会话。刷新之前打开的客户端详情页,提示“该客户端不存在”。
确实奇怪,看图中设置的过期时间是 2 小时,如果确定是 2 小时以内查不到,且 EMQX 在这 2 小时内没有重启过,那就可以看看 emqx 的日志 有什么异常的日志不
有报错。force_shutdown.max_heap_size,应该是这个配置限制了堆大小。
我看官网这个配置默认是32M,为啥报错信息里提示 Max Heap Size: 6291456,只有6M ??
1、那实际是32M,报错信息中的 6M是不准确的?
2、32M的堆内存会分配多大内存 用来保存消息队列中的消息?
1.个人觉得是文档不清晰,没有详细的计算公式说明。
2.全部32M
是的。
我觉得不能用记事本来估算(我不清楚记事本的储存格式)所以没有办法解释,你问问 AI 看看。
你这客户端都没了,消息肯定被丢弃了,你设置会话永不过期应该就没事了吧
这是 force_shutdown 触发导致会话进程被杀,离线消息因此丢失,不是 UI 主动删除。先把运行时配置和 listener 的 zone 对齐确认一下。
关键点:
- force_shutdown 的 message
不是 UI 删除,是 force_shutdown 把会话进程杀了,session 没了,离线消息自然丢。先把运行时配置和 listener 的 zone 对齐确认。
关键点:
- force_shutdown 的 “message queue” 指 Erlang 进程 mailbox,不是 MQTT 离线 mqueue。
- max_heap_size 是进程堆总量(包含会话状态、mqueue、协议栈结构等),不是“只给离线消息的 32MB”。
- 日志里 6MB 多半是配置没生效或被 zone 覆盖了。
先贴这两条输出:
emqx ctl conf show force_shutdown
emqx ctl listeners
如果 listener 绑定了 zone,再贴 zone.<name>.force_shutdown.* 配置。
再补下客户端 CONNECT 参数(clean_start / session_expiry_interval / QoS / 单条 payload 大小 / 离线堆积量)。
临时规避:把 max_heap_size / max_mailbox_size 调大压测,看是否还会被杀;长期要么控制单客户端堆积量,要么用更持久的会话存储策略(看版本/部署再定)。



