【问题标题】:Can I edit messages on mqtt server?我可以在 mqtt 服务器上编辑消息吗?
【发布时间】:2017-12-27 18:15:36
【问题描述】:

构建即时聊天应用(原生 IOS 和 Web)。探索是否使用 XMPP 或 MQTT 作为应用协议。似乎我不能让用户在 XMPP 上编辑旧消息。可以在 MQTT 上编辑消息吗?

示例:我想像 Slack 提供的那样实现“编辑消息”,但是在单击“(已编辑)”以允许用户查看消息的不同版本及其时间戳(例如您在Facebook),启用对话的“审计跟踪”。

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

【问题讨论】:

标签: xmpp chat protocols mqtt messaging


【解决方案1】:

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

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

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

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

  3. 客户端 A 决定编辑消息,以便(通过您设计的某个界面)将修改后的消息发布到 clienta/(唯一消息 id),该消息替换消息,并从订阅者的角度编辑那里的内容。

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

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

【讨论】:

  • 谢谢@blp。欣赏这个例子。为了清楚起见,我刚刚编辑了这个问题,其目的确实是为了保留“编辑历史”及其时间戳,以便对对话进行“审计跟踪”。鉴于这是通过变通方法来实现的,您认为我们最好使用 MQTT 或 XMPP 吗?
  • 或其他一些协议/websockets/JSON等?
  • 我认为问题在于您可以通过所有这些方式实现所有这些事情,它并不真正依赖于协议来提供您可能要运行的那种审计跟踪后端数据库...因此,您更大的环境对您的协议选择比编辑问题更重要。因此,例如,如果存在能源限制或网络可靠性问题,我会使用 MQTT over HTTP。
  • 这可能会有所帮助:stackoverflow.com/a/7131624/7746400
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢@hardillb。那么,根据您的经验,您建议探索什么来实现“编辑”(如 Slack 提供)?
  • 你不会以任何方式实现它。消息应包含元数据以涵盖此类事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2017-04-30
  • 2021-06-20
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多