MQTT 用于聊天应用程序中的客户端通信

Posted

技术标签:

【中文标题】MQTT 用于聊天应用程序中的客户端通信【英文标题】:MQTT for client communication in chat application 【发布时间】:2021-05-17 13:02:30 【问题描述】:

我想开发聊天应用程序并使用 MQTT 和 Web 套接字进行实时通知,客户端的活动状态(主要是 Web 浏览器)。我想知道如何以最佳方式在客户端之间进行通信,以减少 MQTT 的负载并实现顺畅的通信。

例如,如果客户端 A 向客户端 B 发送消息,则选项为

1) 为客户端A和客户端B之间的通信制作单独的主题

如果应用程序中的客户端数量会增加,那么每个用户之间的主题数量会大幅增加,这会给 MQTT 代理带来负担,这看起来不是一个好主意。

2) 根据唯一的客户 ID 发送消息

MQTT 不允许基于客户端 ID 发布消息

3) 为所有客户端创建一个主题进行通信(所有客户端都会订阅该主题,如果消息与其相关,则相关客户端将执行其操作)

很多客户端会收到不需要的消息,并且随着客户端数量的增加,问题也会增加。

如果所有客户端都订阅一个主题,是否可以过滤掉应该接收消息的客户端

制作流畅的聊天应用程序的其他解决方案是什么,以及其他应用程序使用什么解决方案,例如 slack、telegram、whatsapp 等。他们是否也使用 MQTT,如果没有,他们如何实现这一点。

提前致谢

【问题讨论】:

【参考方案1】:

您对第 1 点的理解存在缺陷。

主题对代理的开销几乎为零。拥有数百万个主题不是问题。唯一的开销是:

客户订阅的主题列表,不是问题 为具有持久订阅的离线客户端排队的消息。这绝不会受到主题数量的影响,只是在该客户端离线时发送给该客户端的消息数量。

消息的唯一处理开销是检查给定客户端订阅的主题列表(可能需要进行一点 ACL 检查),然后是实际发送 TCP/IP 数据包以将该消息发送到客户端的开销。

【讨论】:

如果我引入一个微服务作为客户端之间的中介会怎样。该微服务将使用 MQTT 主题与每个客户端建立连接,并将充当中间人。因此,微服务将订阅每个客户端主题并将消息作为消息历史保存在数据库中,如果接收者客户端在线,那么它将同时在接收者客户端的主题中发布消息,如果它离线,则消息已经在数据库中。因此,只要接收者上线,它就可以调用 API 来获取消息历史记录。 再添加一个客户不会改变任何事情 微服务客户端将始终在线,一旦浏览器客户端在线,他们可以通过调用 API 从数据库中获取旧消息,这样代理就不需要存储任何信息。因此,不会消除开销(针对离线时发送到该客户端的消息数量) @JayendraSingh 这真是个好主意,直​​到它实际上不是端到端聊天,隐私问题!!

以上是关于MQTT 用于聊天应用程序中的客户端通信的主要内容,如果未能解决你的问题,请参考以下文章

极智开发 | 带你实践 MQTT 协议

玩转RT-Thread系列教程(13)--MQTT协议通信

玩转RT-Thread系列教程(13)--MQTT协议通信

MQTT-TCP连接通信

需要从 Java 套接字迁移到我的聊天应用程序的 Xmpp 通信

MQTT通信协议在Unity中的应用之——JS实现