【问题标题】:Only limited mqtt clients connect to IBM MQ broker只有有限的 mqtt 客户端连接到 IBM MQ 代理
【发布时间】:2018-12-29 13:03:56
【问题描述】:

我正在尝试使用在 suse linux 上运行的 MQTT 协议 (V3.1) 和 IBM MQ (8.0.0.0) 代理构建推送通知服务,但是我遇到了一个问题。我编写了一个简单的 java 程序来测试 IBM MQ 中的并发连接数。它只是开始实例化 MqttClient 并将它们中的每一个连接到远程 IBM MQ 代理。

public MyConsumer(String topic) throws MqttException{
             this.client = new MqttClient(SERVER_ADDRESS, MqttClient.generateClientId(), new MemoryPersistence());
             client.setCallback(new MyCallback());

             MqttConnectOptions connectOptions = new MqttConnectOptions();
             connectOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1);
             connectOptions.setCleanSession(false);

             try
             {
                 if (!this.client.isConnected())
                 {
                     this.client.connect(connectOptions);
                     this.client.subscribe(topic);
                 }
             }
             catch (Exception e)
             {
                 System.out.println("****** error ******");
                 e.printStackTrace();
             }
         }

奇怪的是,在大约 870 个客户端成功连接到代理后,我得到了“连接丢失 (32109) - java.io.EOFException”异常:

Connection lost (32109) - java.io.EOFException
     at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:146)
     at java.lang.Thread.run(Thread.java:745)
 Caused by: java.io.EOFException
     at java.io.DataInputStream.readByte(DataInputStream.java:267)
     at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:65)
     at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:107)
     ... 1 more

我同时在两台不同的计算机上运行测试程序,以确保问题与测试计算机无关。此外,我在队列管理器中定义了两个遥测通道,每个通道都部署在不同的端口上,但连接到代理的客户端总数仍约为 870! 最后,我创建了两个队列管理器,在这种情况下,客户端连接的数量增加了一倍。我检查了 mqxr 日志,但没有错误日志。谁能告诉我为什么每个队列管理器只接受这个号码连接。

P.S:提及我使用emqtt broker(另一个 mqtt 代理)测试此示例可能会有所帮助,它运行良好(连接数超过 5k)

【问题讨论】:

  • IBM WebSpereMQ 中有许多硬性限制。几乎它们中的任何一个都可以在某个地方进行配置。很可能并发连接的数量或类似的东西已经用尽。但它真的打算同时连接 5k 个并发 应用程序 吗?通常一个应用程序在一个连接中服务多个队列。注意 /sessions/ 的数量不等于连接的数量。
  • @Marcel 您可能知道,MQTT 协议在 TCP/IP 上中继,这意味着它是状态完整的。通过这个测试,我想知道每个 IBM 队列可以处理的最大连接数。显然,每个连接都会在 IBM MQ 上创建一个会话,我看到 IBM MQ 维护所有会话。问题是,如果代理连接到 870 个客户端,新客户端将无法连接到客户端。

标签: java ibm-mq mqtt suse


【解决方案1】:

使用 MQTT 协议 (V3.1) 和 IBM MQ 的推送通知服务 (8.0.0.0) 经纪人

首先,你为什么不使用 MQTT 协议 v3.1.1?

其次,停止使用“0”版本的产品。立即升级到 MQ v8.0.0.10 或更好的 MQ v9.0.0.4。

最后,您正在运行多少个客户端应用程序(进程)来创建 870 个连接?

【讨论】:

  • 我使用 Mqtt V3.1 的原因是 IBM MQ 8.0.0.0 不支持 Mqtt V3.1.1 并抛出 MqttInvalidVersionException。关于升级IBM MQ,我会做,但问题似乎与它有关。对于最后一个问题,它不影响结果。当我运行一个或多个客户端应用程序时,结果是相同的(如上所述,我在两台不同的物理计算机上运行了 2 个客户端应用程序,但总 Mqtt 连接不会改变!)
猜你喜欢
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-02-09
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多