【问题标题】:EMQX- Publish MQTT Topic with unique identifier is taking much more time than Static MQTT TopicEMQX - 发布具有唯一标识符的 MQTT 主题比静态 MQTT 主题花费更多时间
【发布时间】:2022-01-09 14:21:30
【问题描述】:

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

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

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

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

总时间模式 1:/config/{id}/outward::36 sec -----------------> 这里的主题是动态的。 {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));

        
    }
}

【问题讨论】:

    标签: mqtt paho emq


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我了解您对微基准测试的看法。我将删除这些内容。但在日志上我可以看到它运行缓慢。现在的问题是为什么我的发布者在主题是动态的时候发布主题很慢.我知道我的 qos 级别是 1,发布者将等待来自代理而不是来自订阅者的发布(如果我在这里错了,请纠正我)。当主题是静态时,相同的代码仍然可以快速运行。
    • 我可以只在一个客户端上发送 1000 条消息吗?我的工作是通过数据库中的 mqtt 发送数据。如果我将所有消息推送到一个具有动态主题的客户端上,则需要很长时间。所以我做了这个微基准测试。问题只是主题,好像我这样做是为了让一切正常。
    • 您可以从单个客户端发送任意数量的消息,需要多长时间取决于很多事情,但是实现/配置代理遵循的消息大小可能是消息率的主要限制因素
    • 我已经在这里更新了我的问题,您可以查看一下吗
    • 这仍然不是一个有效的测试,您需要在发布循环之前预先计算所有动态主题以使其更好。但同样,这不太可能是客户端问题,而是代理配置/设计问题。还可以尝试使用 QOS 0 进行测试,看看会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多