Java HiveMQ 客户端每秒从 docker swarm 中的不同端口重新连接

问题描述

我有一个 Java Spring 服务,我最近在其中添加了到带有 hiveMQ 库的 eclipse-mosquitto-container 的连接。 mosquitto 和 java 服务都在具有以下配置的 docker swarm 中运行:

version: "3.7"

services:
  mqtt:
    image: eclipse-mosquitto:2.0.7
    volumes:
      - mqtt_data:/mosquitto/data
      - /etc/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
    secrets:
      - mqtt_secret
    networks:
      mqtt_net:
        aliases:
          - mqtt

networks:
  mqtt_net:
    external: true
volumes:
  mqtt_data:
    external: true
secrets:
  mqtt_secret:
    external: true

和 Java 服务(我稍微简化了它并省略了数据库等的环境变量,使其更易于阅读):

version: "3.7"

services:
  my-app:
    image: my-registry/my-app
    networks:
      - MysqL_net
      - gateway_net
      - es_net
      - mqtt_net

networks:
  MysqL_net: 
    external: true
  gateway_net:
    external: true
  notes_es_net:
    external: true
  mqtt_net:
    external: true

我尝试在本地针对 mqtt 运行 java 服务,该服务没有问题。它也可以在服务器上运行,但是一旦 java-container 启动我的 mqtt-logs EXPLODE,每秒就会有大量消息:

mqtt_mqtt.1   | 1617469247: New connection from 10.0.6.6:48830 on port 1883.
mqtt_mqtt.1   | 1617469247: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469247: New client connected from 10.0.6.6:48830 as 8nb40u8qa88t9f0qs1gt28 (p5,c1,k60,u'notes-app').
mqtt_mqtt.1   | 1617469247: New connection from 10.0.6.6:48836 on port 1883.
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48838 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48838 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48842 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48836 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48842 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48848 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48848 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48854 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48854 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48856 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48856 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469248: New connection from 10.0.6.6:48858 on port 1883.
mqtt_mqtt.1   | 1617469248: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469248: New client connected from 10.0.6.6:48858 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469249: New connection from 10.0.6.6:48860 on port 1883.
mqtt_mqtt.1   | 1617469249: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1   | 1617469249: New client connected from 10.0.6.6:48860 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').
mqtt_mqtt.1   | 1617469249: New connection from 10.0.6.6:48862 on port 1883.
mqtt_mqtt.1   | 1617469249: Client 8nb40u8qa88t9f0qs1gt28 already connected,closing old connection.
mqtt_mqtt.1    | 1617469249: New client connected from 10.0.6.6:48862 as 8nb40u8qa88t9f0qs1gt28 (p5,u'notes-app').

在我看来,好像客户端每秒多次重新连接到不同的端口,这对我来说完全是个谜。 docker swarm 是否在内部对网络做了一些可以解释这一点的事情?或者 hiveMQ 客户端是否会在重新连接时更改端口?

我不知道如何解释这种行为或如何解决它。我尝试使用 hiveMQ-reconnect-config,但它总是正常工作,并且一旦部署在 docker swarm 中就“坏了”。

这是我在 java 中的 hiveMQ 客户端(在日志开始发送垃圾邮件之前,我没有发送消息或任何内容):

var builder = Mqtt5Client.builder()
                .identifier("notes-app-" + UUID.randomUUID().toString())
                .serverHost(host)
                .automaticReconnectWithDefaultConfig();
        if (user != null && password != null) {
            builder = builder.simpleAuth().username(user).password(password.getBytes(StandardCharsets.UTF_8)).applySimpleAuth();
        }
        this.publisher = builder.build();
        this.publisher.toBlocking().connect();

除了大量的日志外,功能不受影响。然而,这种行为对我来说看起来并不健康,我相信一旦多个客户端连接或端口号过大,这会遇到问题。

谁能指出我做错了什么的正确方向?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)