【发布时间】:2021-08-22 14:50:03
【问题描述】:
我正在使用 emqx 代理,我想在磁盘上持久化会话,以便在代理因任何原因重启时可以恢复会话。
我做什么:
- 使用 docker-compose 启动 emqx 代理:
emqx1:
image: emqx/emqx:v4.0.0
environment:
- EMQX_NAME=emqx
- EMQX_NODE__NAME=emqx.local.node
- EMQX_HOST=node1.emqx.io
- EMQX_CLUSTER__DISCOVERY=static
- EMQX_RETAINER__STORAGE_TYPE=disc
volumes:
- emqx-data:/opt/emqx/data
- emqx-etc:/opt/emqx/etc
- emqx-log:/opt/emqx/log
ports:
- 18083:18083
- 1883:1883
- 8081:8081
networks:
gateway-api:
aliases:
- node1.emqx.io
- 使用 Paho MQTT 库启动一个 Go 订阅客户端,配置如下。客户端的代码可以在paho repo的“stdinpub”和“stdoutsub”文件夹中找到
clientId = "sub1"
qos = 1
clean = false
topic_subscribe = "topic1"
- 使用此配置启动 Go 发布客户端并发布消息:
clientId = ""
clean = true
和消息:
qos = 1
retain = false
topic = "topic1"
payload = "test"
- 然后我断开客户端“sub1”的连接并发送第二条 qos=1 的消息:
qos = 1
retain = false
topic = "topic1"
payload = "test2"
此消息未传递到客户端“sub1”,因此代理将其排队(qos=1)。事实上,如果我重新启动 sub1 客户端,它确实会收到消息“test2”。
但是,如果我在重新启动客户端“sub1”之前重新启动代理,那么“test2”会丢失并且无法交付。
我尝试了将retain 设置为true 的相同测试,即使在代理重新启动后,消息“test2”也能很好地传递。因此代理将保留的消息保存在磁盘上,但不是客户端会话。
知道为什么吗?是否有我应该更改的配置以将客户端会话保留在磁盘上?
【问题讨论】:
-
保留标志与具有持久会话和 QOS >= 1 订阅的离线客户端的排队消息无关,请勿将两者混为一谈。您应该将消息视为已排队,而不是保留。
-
另外快速浏览一下文档,表明客户端会话持久性可能是一项企业功能,在代理的基本版本中不可用。
-
@hardillb 感谢对词汇的更正,我更新了我的帖子。可以将文档链接到付费计划中的位置吗?我找不到它
-
免费版本的文档中没有列出配置选项,但专业文档中有配置多个会话存储选项的选项
-
@cylon86 请参阅Features List - 您正在寻找的功能是“数据持久性”。有相同问题的用户也有许多问题(例如1、2)。