首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重启后emqx MQTT代理不会持久化会话

重启后emqx MQTT代理不会持久化会话
EN

Stack Overflow用户
提问于 2021-06-04 14:34:34
回答 2查看 1K关注 0票数 1

我正在使用emqx,我希望将会话持久化到磁盘上,以便在代理出于任何原因重新启动时可以恢复会话。

我所做的:

  • 使用坞-组合启动emqx代理:
代码语言:javascript
复制
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 lib启动Go订阅客户端。客户端的代码可以在泛美卫生组织回购中的"stdinpub“和"stdoutsub”文件夹中找到。
代码语言:javascript
复制
clientId = "sub1"
qos = 1
clean = false
topic_subscribe = "topic1"
  • 使用此配置启动Go发布客户端,并发布消息:
代码语言:javascript
复制
clientId = ""
clean = true

并传达如下信息:

代码语言:javascript
复制
qos = 1
retain = false
topic = "topic1"
payload = "test"
  • 然后,我断开客户端"sub1“的连接,用qos=1发送第二条消息:
代码语言:javascript
复制
qos = 1
retain = false
topic = "topic1"
payload = "test2"

此消息未传递给客户端"sub1“,因此代理对其进行队列(qos=1)。实际上,如果我重新启动sub1客户机,它确实会得到消息"test2“。

但是,如果在重新启动客户机"sub1“之前重新启动代理,那么"test2”就会丢失,并且不会被传递。

我对retain设置为true进行了相同的测试,即使在重新启动代理之后,消息"test2“也会很好地传递。因此,代理很好地将保留的消息保存在磁盘上,而不是客户端会话。

知道为什么吗?是否应该将配置更改为在磁盘上持久化客户端会话?

EN

回答 2

Stack Overflow用户

发布于 2021-07-07 07:55:13

如评论中所述。

客户端会话存储是一个功能,只有在"Enterpise“付费的版本的emqx,而不是免费使用的版本。

特征列表中可以看出这一点,1 & 2的问题也询问了这个特性。

票数 0
EN

Stack Overflow用户

发布于 2021-07-07 06:02:34

磁盘中的保留消息存储:

代码语言:javascript
复制
# etc/plugins/emqx_retainer.conf

## Where to store the retained messages.
retainer.storage_type = disc_only

EMQ开源产品不支持服务器内消息的持久性,这是架构设计的选择。首先,EMQ解决的核心问题是连接和路由;其次,我们认为内置持久性是一个错误的设计。具有内置消息持久性的传统MQ服务器,例如广泛使用的JMS服务器ActiveMQ,几乎在每个主要版本中都在重新设计持久性部分。内置消息持久性的设计有两个问题:如何平衡内存和磁盘的使用?消息路由是基于内存的,而消息存储是基于磁盘的.在多服务器分布式集群体系结构下,如何放置队列以及如何复制队列的消息?Kafka针对上述问题做出了正确的设计:一个完全基于磁盘分布式提交日志的消息服务器。EMQ在设计中将消息路由和消息存储分开之后,数据复制、灾难恢复备份甚至应用程序集成都可以灵活地在数据层实现。在产品中,您可以通过规则引擎或插件将消息持久化到数据库(如Redis、MongoDB、Cassandra、MySQL、PostgreSQL )和消息队列(如RabbitMQ和Kafka )。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67839097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档