如何在 MQTT 代理 Mosquitto 中显示已发送和已读回执?
How to display delivered and read receipts in MQTT broker Mosquitto?
我想在我的消息传递平台中向用户显示已发送和已读回执。我正在使用 Eclipse 的 Paho 库和 Mosquitto 作为代理。由于 Mosquitto 不存储消息,这是最好的 way/plugin 到
- 显示已送达的回执 - 如何使用 QoS2 确认回执来做到这一点?
- 显示阅读回执 - 建议我这样做
- 如何存储消息以便用户可以查看他们的聊天记录? mysql 中的任何架构见解都将非常有帮助。
您问题的快速解答:
High QOS (1/2) 不是端到端的交付确认,它只是经纪人和客户之间的确认。例如以 QOS 2 发布的发布者 确认仅在发布者和代理之间进行,而不是然后转发给订阅者(无论如何订阅者可能以不同的 QOS 订阅)。唯一的方法是从接收端向发送方发送一条单独的消息。此外,任何给定主题的订阅者可能不止一个,因此您必须考虑这将如何运作。
同样,唯一的方法是在阅读消息时发送单独的消息
您必须自己实施。唯一可能有帮助的是一些像内置支持在某些代理中存在的数据库中存储消息的东西(这不是规范的一部分,因此完全有利于实现)例如hivemq
Hardlib 的答案 100% 符合目标,但我会添加一些关于实现的想法。
我认为对 MQTT 的一个常见误解是它实际上是一种 M2M(机器对机器)协议,而不是用于在用户之间交换消息的系统。这并不是说您不能将它用于消息传递(facebook 可以),而是说它存在于 MQTT 之上的一个层中。换句话说,MQTT 旨在在机器之间路由消息,而无需关心这些消息的内容。这意味着用户级细节(交付确认等)实际上并不是它的一部分,而是您在 MQTT 之上实现的东西。
所以这里有一些关于如何在 MQTT 上实现你所建议的想法:
考虑这样一种情况,您有两个客户(X 和 Z)都可以访问同一个经纪人(Y)。要让客户端 X 确认它已收到来自客户端 Z 的消息,只需让客户端 X 向客户端 Z 订阅的主题(假设 confirmations/z)发送消息即可。这在 Python 或您正在编写应用程序的任何内容中实现都很简单。(例如,我使用该基本过程来测量我的经纪人的往返时间。)
但是,鉴于 QoS 可以保证代理已收到消息(并且可以保留或以其他方式为其他客户端保留),我会质疑这是否真的有必要,除非客户端 Z 确切知道这一点至关重要当客户端 X 收到消息时。
根据您的需要,有多种方法可以提供主题的历史记录。有关 MySQL 的详细信息,请参阅答案 and here。但是,如果您只需要本地聊天历史记录或 activity 几个主题的记录,请考虑简单地将带有时间戳的有效负载输出到文本文件或 JSON。 MySQL 感觉有点矫枉过正,除非您要处理大量消息或需要编写复杂的查询。
我想在我的消息传递平台中向用户显示已发送和已读回执。我正在使用 Eclipse 的 Paho 库和 Mosquitto 作为代理。由于 Mosquitto 不存储消息,这是最好的 way/plugin 到
- 显示已送达的回执 - 如何使用 QoS2 确认回执来做到这一点?
- 显示阅读回执 - 建议我这样做
- 如何存储消息以便用户可以查看他们的聊天记录? mysql 中的任何架构见解都将非常有帮助。
您问题的快速解答:
High QOS (1/2) 不是端到端的交付确认,它只是经纪人和客户之间的确认。例如以 QOS 2 发布的发布者 确认仅在发布者和代理之间进行,而不是然后转发给订阅者(无论如何订阅者可能以不同的 QOS 订阅)。唯一的方法是从接收端向发送方发送一条单独的消息。此外,任何给定主题的订阅者可能不止一个,因此您必须考虑这将如何运作。
同样,唯一的方法是在阅读消息时发送单独的消息
您必须自己实施。唯一可能有帮助的是一些像内置支持在某些代理中存在的数据库中存储消息的东西(这不是规范的一部分,因此完全有利于实现)例如hivemq
Hardlib 的答案 100% 符合目标,但我会添加一些关于实现的想法。
我认为对 MQTT 的一个常见误解是它实际上是一种 M2M(机器对机器)协议,而不是用于在用户之间交换消息的系统。这并不是说您不能将它用于消息传递(facebook 可以),而是说它存在于 MQTT 之上的一个层中。换句话说,MQTT 旨在在机器之间路由消息,而无需关心这些消息的内容。这意味着用户级细节(交付确认等)实际上并不是它的一部分,而是您在 MQTT 之上实现的东西。
所以这里有一些关于如何在 MQTT 上实现你所建议的想法:
考虑这样一种情况,您有两个客户(X 和 Z)都可以访问同一个经纪人(Y)。要让客户端 X 确认它已收到来自客户端 Z 的消息,只需让客户端 X 向客户端 Z 订阅的主题(假设 confirmations/z)发送消息即可。这在 Python 或您正在编写应用程序的任何内容中实现都很简单。(例如,我使用该基本过程来测量我的经纪人的往返时间。)
但是,鉴于 QoS 可以保证代理已收到消息(并且可以保留或以其他方式为其他客户端保留),我会质疑这是否真的有必要,除非客户端 Z 确切知道这一点至关重要当客户端 X 收到消息时。
根据您的需要,有多种方法可以提供主题的历史记录。有关 MySQL 的详细信息,请参阅答案