我正在使用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.ioclientId = "sub1"
qos = 1
clean = false
topic_subscribe = "topic1"clientId = ""
clean = true并传达如下信息:
qos = 1
retain = false
topic = "topic1"
payload = "test"qos = 1
retain = false
topic = "topic1"
payload = "test2"此消息未传递给客户端"sub1“,因此代理对其进行队列(qos=1)。实际上,如果我重新启动sub1客户机,它确实会得到消息"test2“。
但是,如果在重新启动客户机"sub1“之前重新启动代理,那么"test2”就会丢失,并且不会被传递。
我对retain设置为true进行了相同的测试,即使在重新启动代理之后,消息"test2“也会很好地传递。因此,代理很好地将保留的消息保存在磁盘上,而不是客户端会话。
知道为什么吗?是否应该将配置更改为在磁盘上持久化客户端会话?
发布于 2021-07-07 07:55:13
发布于 2021-07-07 06:02:34
磁盘中的保留消息存储:
# etc/plugins/emqx_retainer.conf
## Where to store the retained messages.
retainer.storage_type = disc_onlyEMQ开源产品不支持服务器内消息的持久性,这是架构设计的选择。首先,EMQ解决的核心问题是连接和路由;其次,我们认为内置持久性是一个错误的设计。具有内置消息持久性的传统MQ服务器,例如广泛使用的JMS服务器ActiveMQ,几乎在每个主要版本中都在重新设计持久性部分。内置消息持久性的设计有两个问题:如何平衡内存和磁盘的使用?消息路由是基于内存的,而消息存储是基于磁盘的.在多服务器分布式集群体系结构下,如何放置队列以及如何复制队列的消息?Kafka针对上述问题做出了正确的设计:一个完全基于磁盘分布式提交日志的消息服务器。EMQ在设计中将消息路由和消息存储分开之后,数据复制、灾难恢复备份甚至应用程序集成都可以灵活地在数据层实现。在产品中,您可以通过规则引擎或插件将消息持久化到数据库(如Redis、MongoDB、Cassandra、MySQL、PostgreSQL )和消息队列(如RabbitMQ和Kafka )。
https://stackoverflow.com/questions/67839097
复制相似问题