【问题标题】:can MQTT be used to implement Request / Response behavior可以使用 MQTT 来实现请求/响应行为吗
【发布时间】:2021-08-12 21:37:36
【问题描述】:

我们计划使用 MQTT 将消息从我们的服务器传送到安卓设备 我们决定使用开源服务器 mosquitto。

在大多数情况下,这就足够了。(发布/订阅) 但是我们有一种情况,客户端需要发送参数并从服务器获取响应。 我知道直接的方法是使用 Http(例如 Servlet)。 但是我们可以使用 MQTT 来实现这一点,因为这意味着用户的带宽消耗更低?

【问题讨论】:

    标签: android http mqtt


    【解决方案1】:

    是的,它只需要仔细设计您的主题结构。举个非常简单的例子,你可以发布到control/<client id>/request,订阅control/<client id>/response

    【讨论】:

    • 但是假设我有 10000 个客户端都从服务器请求,如果我使用 Http servlet 实现这个,我就不必担心任何事情。但是组件(在服务器端)可以处理同时到来的所有请求吗?换句话说,客户端可以订阅的最大主题数是多少,因为对于每个连接的客户端,我们都必须添加新的订阅??
    • 是的,这当然是一个问题。像“我的测试涉及订阅 100K 主题的 100K 客户”(来自 lists.launchpad.net/mosquitto-users/msg00110.html)这样的引语应该可以让您了解什么是可能的!
    • bitreactive.com/mqtt-request-response 有这种精确的方法,它完全与主题结构有关
    • @Clocker 链接失效
    【解决方案2】:

    从 MQTT 版本 5 开始,这是可能的。规范中指定了请求/响应模式。

    看看这个:https://stackoverflow.com/a/59916330/1137669

    【讨论】:

      【解决方案3】:

      我建议你看看RabbitMQ handles RPC。虽然 AMQP 与 MQTT 不同,但仍有相当多的高级继承。

      归结为您需要能够使用消息标头创建具有相关 ID 的临时“回复”队列。或者正如@ralight 所说,为每个客户打开两个队列。为每个客户端打开两个队列的问题当然是排序,因此您将不得不在内部使用关联 ID 和缓冲区和路由(如果您的应用是同步的,则删除直到找到关联 ID)。

      【讨论】:

        【解决方案4】:

        你也可以用 xargs 完成同样的事情。

        下面是一个shell脚本示例:

        mqtt_eg_link.sh
        
        d=$(date +%Y-%m-%d)
        mosquitto_pub -h <your host> -p 1880 -t status/ghost/log -m "$d >> eg listener running"
        mosquitto_sub -h <your host> -p 1880 -t ghost | xargs -t -I {} cmd.exe /c eg.bat {}
        

        【讨论】:

          【解决方案5】:

          您应该使用等待/通知将发布/订阅转移到Dubbo框架DefaultFuture中使用的请求/响应,

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-10
            • 1970-01-01
            • 2013-04-16
            • 1970-01-01
            • 1970-01-01
            • 2021-07-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多