跳到主要内容

Docker-EMQX

EMQX Offical EMQX Offical Docker EMQX Docker EMQX MQTTX Web

1. Docker安装

# 创建Network
docker network create dev

# 创建数据卷
docker volume create emqx_data

# 创建文件夹
mkdir -p D:/docker/emqx/{conf,data,logs}

# 获取默认配置文件
docker run -d --env HOCON_ENV_OVERRIDE_PREFIX=DEV_ \
--env DEV_EMQX_MQTT__SHARED_SUBSCRIPTION=true \
--env DEV_EMQX_ZONE__EXTERNAL__SHARED_SUBSCRIPTION=true \
--env DEV_EMQX_BROKER__SHARED_SUBSCRIPTION_STRATEGY=round_robin \
--env DEV_EMQX_BROKER__SHARED_DISPATCH_ACK_ENABLE=true \
--name emqx_temp emqx:4.3 \
&& docker cp emqx_temp:/opt/emqx/etc/ D:/docker/emqx/etc/ \
&& cp -r D:/docker/emqx/etc/* D:/docker/emqx/conf/ \
&& docker stop emqx_temp && docker rm emqx_temp

docker run -d \
--publish 1883:1883 \
--publish 8081:8081 \
--publish 8083:8083 \
--publish 8084:8084 \
--publish 8883:8883 \
--publish 18083:18083 \
--volume //d/docker/emqx/data:/opt/emqx/data \
--volume //d/docker/emqx/conf:/opt/emqx/etc \
--volume //d/docker/emqx/logs:/opt/emqx/log \
--env HOCON_ENV_OVERRIDE_PREFIX=DEV_ \
--env DEV_EMQX_MQTT__SHARED_SUBSCRIPTION=true \
--env DEV_EMQX_ZONE__EXTERNAL__SHARED_SUBSCRIPTION=true \
--env DEV_EMQX_BROKER__SHARED_SUBSCRIPTION_STRATEGY=round_robin \
--env DEV_EMQX_BROKER__SHARED_DISPATCH_ACK_ENABLE=true \
--net dev \
--restart=no \
--name emqx \
emqx:4.3

docker run -d \
--publish 18084:18083 \
--publish 1884:1883 \
--volume //d/docker/emqx/data:/opt/emqx/data \
--volume //d/docker/emqx/conf:/opt/emqx/etc \
--volume //d/docker/emqx/logs:/opt/emqx/log \
--env EMQX_MQTT__SHARED_SUBSCRIPTION=true \
--env EMQX_ZONE__EXTERNAL__SHARED_SUBSCRIPTION=true \
--env EMQX_BROKER__SHARED_SUBSCRIPTION_STRATEGY=round_robin \
--env EMQX_BROKER__SHARED_DISPATCH_ACK_ENABLE=true \
--net dev \
--restart=no \
--name emqx2 \
emqx:4.3

docker exec -it -u root emqx /bin/bash

# 默认配置文件
vim /etc/emqx/emqx.conf

# MQTTX Web 只能使用Websocket连接MQTT
docker run -d \
--publish 1880:80 \
--net dev \
--restart=no \
--name mqttx \
emqx/mqttx-web:v1.9.6

注: 使用环境变量修改默认配置只支持Configuration Files列表中的属性,共享订阅的配置使用环境变量设置无效

2. 共享订阅

  1. 开启共享订阅
# 开启共享订阅
mqtt.shared_subscription = true
zone.external.shared_subscription = true

# 负载均衡策略 random round_robin sticky hash
broker.shared_subscription_strategy = round_robin

# 适用于 QoS1 QoS2 消息,启用后,当客户端离线时,将消息派发给订阅组内其他客户端
broker.shared_dispatch_ack_enabled = true
  1. 共享订阅的负载均衡策略
均衡策略说明
random在所有订阅者中随机选择
round_robin按照订阅顺序
sticky一直发往上次选取的订阅者
hash按照发布者 ClientID 的哈希值
hash_clientid按照发布者 ClientID 的哈希值
hash_topic按照topic 的哈希值
  1. 关于Topic路径
$share/<group-name>/<topic-name>(/<sub_topic-name>)*
  • $share : 共享订阅的标识
  • group-name : 共享订阅的组别名称 group-name
  • topic-name : 实际的topic名称
  • topic-sub-name: topic名称,可以有多段组成
示例前缀组别Topic 名称
$share/abc/t/1$shareabct/1
$share/group/topic/sub_topic$sharegrouptopic/sub_topic
$queue/topic/sub_topic$queue-topic/sub_topic

注意:

  • 在订阅Topic时,使用 $share/<group-name>/<topic-name>$queue/<topic-name>
  • 在发送消息时,使用 <topic-name>,不需要带前缀组别