【问题标题】:How to display delivered and read receipts in MQTT broker Mosquitto?如何在 MQTT 代理 Mosquitto 中显示已送达和已读回执?
【发布时间】:2017-06-27 14:59:39
【问题描述】:

我想在我的消息传递平台中向用户显示已送达和已读回执。我正在使用以 Mosquitto 作为代理的 Eclipse 的 Paho 库。由于 Mosquitto 不存储消息,这是最好的方式/插件

  1. 显示已送达收据 - 如何使用 QoS2 确认收据来执行此操作?
  2. 显示已读回执 - 建议我这样做
  3. 如何存储消息以便用户查看他们的聊天记录?对 mysql 的任何架构见解都会非常有帮助。

【问题讨论】:

    标签: mqtt publish-subscribe mosquitto messagebroker


    【解决方案1】:

    快速回答您的问题:

    1. 高 QOS (1/2) 不是端到端的交付确认,它只是经纪人和客户之间的确认。例如发布者在 QOS 2 发布确认仅在发布者和代理之间进行,而不是随后转发给订阅者(无论如何,订阅者可能以不同的 QOS 订阅)。做到这一点的唯一方法是从接收端将单独的消息发送回发送者。此外,任何给定主题可能有多个订阅者,因此您必须考虑这将如何运作。

    2. 同样,这样做的唯一方法是在阅读消息时发送单独的消息

    3. 您必须自己实现。唯一可能有帮助的是内置支持将消息存储在某些代理中存在的数据库中(这不是规范的一部分,因此完全有利于实现),例如hivemq

    【讨论】:

    • 感谢每个部分的明确答案。还有一件事 - 我们可以更改 mosquitto 的来源或添加插件以在传递给订阅者之前处理消息(例如检查俚语)吗?我知道不建议这样做,因为这会减慢代理速度,但我想除了在交付前拦截和处理之外别无他法。
    • Mosquitto 是开源软件,你可以为所欲为。但您可能会发现其他一些经纪人更适合这种情况
    • 有关维护唯一消息 ID(跨客户端和代理)的任何帮助,以便我们可以发布具有正确 ID 的已读消息以在前端进行更改。
    【解决方案2】:

    Hardlib 的答案是 100% 达标,但我会补充一些关于实施的想法。

    我认为对 MQTT 的一个常见误解是它实际上是一个 M2M(机器对机器)协议,而不是用于在用户之间交换消息的系统。这并不是说您不能将它用于消息传递(facebook 确实如此),但它存在于 MQTT 之上的一个层中。换句话说,MQTT 旨在在机器之间路由消息,而很少关心这些消息的内容。这意味着用户级别的细节(交付确认等)并不是真正的一部分,而是您在 MQTT 之上实现的东西。

    因此,这里有一些关于如何在 MQTT 之上实施您提出的建议的想法:

    假设您有两个客户端 (X 和 Z),它们都可以访问同一个代理 (Y)。要让客户端 X 确认它已收到来自客户端 Z 的消息,只需让客户端 X 向客户端 Z 订阅的主题(比如说确认/z)发送一条消息。这在 Python 或您正在编写应用程序的任何内容中实现都很简单。(例如,我使用该基本过程来测量我的代理的往返时间。)

    但是,鉴于 QoS 可以保证代理已收到消息(并且它可以保留或以其他方式保留给其他客户端),我会质疑这是否真的有必要,除非客户端 Z 确切知道客户端何时X 收到消息。

    根据您的需要,有多种方法可以提供主题的历史记录。有关 MySQL 的详细信息,请参阅答案 herehere。但是,如果您只需要本地聊天历史记录或一些主题的活动记录,请考虑简单地将带有时间戳的有效负载输出到文本文件或 JSON。除非您正在处理大量消息或需要编写复杂的查询,否则 MySQL 感觉有点矫枉过正。

    【讨论】:

      猜你喜欢
      • 2021-07-16
      • 1970-01-01
      • 2015-08-18
      • 2016-06-12
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多