我可以在 mqtt 服务器上编辑消息吗?

Can I edit messages on mqtt server?

构建即时聊天应用程序(本机 IOS 和网络)。探索是使用 XMPP 还是 MQTT 作为应用程序协议。看来我不能让用户在 XMPP 上编辑旧消息。可以在 MQTT 上编辑消息吗?

示例:我想像 Slack 提供的那样实施 "Edit Message",但是在单击“(已编辑)”时允许用户查看消息的不同版本及其时间戳(如评论的编辑历史记录)您在 Facebook 中找到),启用 "audit trail" 对话。

跟进:看来这只能通过 "hack" 来实现,在 XMPP 或 MQTT 或其他一些 protocol/websockets/JSON 等上完成破解会更好吗?

一旦 MQTT 消息发布到代理,发布客户端就完全无法控制该消息。

大多数经纪人也不允许您编辑消息,因为他们只会立即将消息转发给所有订阅相关主题的客户,并为任何具有持久订阅的离线客户排队消息。

唯一的例外可能是 mosca 代理,它在消息到达代理时有一个回调,但这不允许用户编辑消息,只有系统可能在它之前的瞬间更新有效负载已转发给订阅的客户。

Hardlib 的建议是正确的,大多数 MQTT 实现不支持以这种方式编辑消息,实现它会打破发布者和订阅者之间的松散耦合,而这正是 MQTT 的优点。换句话说,这应该在更高级别或通过其他方式实现。

就是说,如果我将编辑理解为能够在初始发布期间更改代理转发给不在线的客户的内容,则您可以使用保留的消息来实现此目的。考虑一下:

  1. 客户端 A 订阅了主题 clientb/#,客户端 B 订阅了主题 clienta/#。

  2. 客户端A发布消息给clienta/(唯一消息id),而客户端B没有主动连接。代理保留消息。

  3. 客户 A 决定编辑消息,以便(通过您设计的某个界面)他们将修改后的消息发布到 clienta/(唯一消息 ID)以替换消息,并且从订阅者的角度来看,编辑还有什么。

  4. 客户端 B 在他们上线时收到修改后的消息并且(只要没有持久会话或类似的东西)不知道更改。

从这个例子中,您可能可以看出为什么这是一个坏主意,因为服务器会将每条消息保留在不同的主题中,并且可能需要定期修剪......更不用说它会把时间戳搞得一团糟并需要各种其他变通办法。但是,如果出于某种原因您必须以这种方式实现它,您可以破解一些可以一起使用的东西。