问题描述
我有一个 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 (将#修改为@)