1

我正在使用 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
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”会丢失并且不会被传递。

我尝试使用retainset to进行相同的测试,true即使在代理重新启动后,消息“test2”也能很好地传递。因此代理将保留的消息保存在磁盘上,但不是客户端会话。

知道为什么吗?是否有我应该更改的配置以将客户端会话保留在磁盘上?

4

2 回答 2

0

正如评论中所说的那样。

客户端 Session 存储是 emqx 付费版“企业版”才有的功能,不是免费版。

这可以从功能列表中看出,问题12也询问了该功能。

于 2021-07-07T07:55:13.820 回答
-1

磁盘中的保留消息存储:

# etc/plugins/emqx_retainer.conf

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

EMQ X 开源产品不支持消息在服务器内部的持久化,这是一种架构设计的选择。首先,EMQ X 解决的核心问题是连接和路由;其次,我们认为内置持久性是错误的设计。

具有内置消息持久性的传统 MQ 服务器,例如广泛使用的 JMS 服务器 ActiveMQ,几乎在每个主要版本中都在重新设计持久性部分。内置消息持久化的设计有两个问题:

如何平衡内存和磁盘的使用?消息路由是基于内存的,而消息存储是基于磁盘的。多服务器分布式集群架构下,如何放置Queue,如何复制Queue的消息?Kafka针对上述问题做出了正确的设计:完全基于磁盘分布式Commit Log的消息服务器。

EMQ X 在设计上将消息路由和消息存储职责分离后,可以在数据层面灵活实现数据复制、容灾备份甚至应用集成。

在 EMQ X 企业版产品中,您可以通过规则引擎或插件将消息持久化到 Redis、MongoDB、Cassandra、MySQL、PostgreSQL 等数据库,以及 RabbitMQ、Kafka 等消息队列。

于 2021-07-07T06:02:34.543 回答