0

我试图在 emqx 代理上发布不同主题的消息。场景在使用一个客户端发布动态主题时需要很多时间,如果我们将主题名称设置为静态,则需要的时间要少得多。

在这里,我发布了相同的结果和代码。

我正在使用带有 Eclipse paho 客户端版本 3 和 Qos 级别 1 的 EMQX 代理。

使用 100 条简单发布消息处理不同主题的时间(在此处将 id 视为动态):

总时间模式 1:/config/{id}/outward::36 sec -----------------> HERE TOPIC 是 DYNAMIC。{id} 是一个变量,其值在循环中发生变化,如下面的代码所示

总时间模式 2:/config/test::1.2 sec ------------------------------------> HERE TOPIC 是 STATIC

我该如何发布具有不同 ID 的消息,以便主题创建不会花费太多时间?

public class MwttPublish {
    static IMqttClient instance= null;
public static IMqttClient getInstance() {
        try {
            if (instance == null) {         
                instance = new MqttClient(mqttHostUrl, "SimpleTestMQTT");
            }
            if (!instance.isConnected()) {
                MqttConnectOptions options = new MqttConnectOptions();
                options.setUserName("test");
                options.setPassword("test".toCharArray());
                options.setAutomaticReconnect(true);
                options.setCleanSession(false);
                options.setConnectionTimeout(10);

                instance.connect(options);
            }
        } catch (final Exception e) {
            System.out.println("Exception in mqtt: {}" + e.getMessage());
        }
        return instance;
    }
    public static void publishMessage() throws MqttException {
        IMqttClient iMqttClient = getInstance();
        MqttMessage mqttMessage = new MqttMessage("Hello".getBytes());
        mqttMessage.setQos(1);
        mqttMessage.setRetained(true);

        System.out.println("Publish Start for pattern 1");
        int i =0;
        final BigDecimal mqttmsgPublishstartTime = new BigDecimal(System.currentTimeMillis());
        do {
            iMqttClient.publish("/config/" +i +"/outward", mqttMessage);
            i++;
        }while(i<100);
        System.out.println("Total time  pattern 1 /config/i/outward::" + (new BigDecimal(System.currentTimeMillis())).subtract(mqttmsgPublishstartTime));


        System.out.println("Publish Start for pattern 2");

        final BigDecimal mqttmsgPublishstartTime1 = new BigDecimal(System.currentTimeMillis());
        i =0;
        do {
            iMqttClient.publish("/config/test", mqttMessage);
            i++;
        }while(i<100);
        System.out.println("Total time pattern 2 /config/test::" + (new BigDecimal(System.currentTimeMillis())).subtract(mqttmsgPublishstartTime1));

        
    }
}
4

1 回答 1

0

这不是一个有效的测试,您已经陷入了许多经典的微型基准测试陷阱,例如

  • 样本量太小
  • 不考虑 JVM JIT 预热或 GC 开销
  • 不比较喜欢,例如连接主题字符串所花费的时间

请查看以下内容:https ://stackoverflow.com/a/2844291/504554

同样从 MQTT 的角度来看,主题是短暂的,它们仅在消息发布的那一刻才真正“存在”,同时代理检查具有匹配模式的订阅客户端。

于 2021-12-03T09:25:00.820 回答