【问题标题】:Mobile Chat application on Google App Engine and Socket.IOGoogle App Engine 和 Socket.IO 上的移动聊天应用程序
【发布时间】:2018-01-29 21:31:48
【问题描述】:

我正在使用 Node.JS 的 Socket.IO 创建一个聊天应用程序,我需要澄清一些事情。

我正在我的应用程序中实现离线消息传递,这意味着当用户打开应用程序时,他将收到他在在线时错过的所有消息。

这是我的方法:

1) 客户端打开应用并订阅/加入房间 2)客户端向Socket.IO发送消息 3) Socket.IO 将消息插入到某种数据库/数据存储中 4) 当客户端尝试检索消息时,它会从数据库/数据存储中提取并保存在用户手机上,然后从数据库中删除。

这是一个正确的方法吗?

我在网上查看,有人建议使用任务/消息队列,例如 Google App Engines 任务队列,但我不确定这是如何工作的。

【问题讨论】:

    标签: ios node.js sockets socket.io chat


    【解决方案1】:

    您的方法听起来不错,但我不会从数据库中删除消息,至少不会在客户端收到消息后立即删除。

    从您的问题看来,您目前没有将消息保存到数据库中。 这种方法有一些缺点;例如,在发送某些消息时,用户无法在未连接的设备上查看他们的聊天记录。

    我可以想到两种更优雅的方式:

    1. 将所有消息保存到数据库。在 websocket 连接和重新连接上,获取比您的最新消息更新的所有消息(此方法假定您的聊天中没有编辑功能,因为不会以这种方式获取编辑)。后者可以使用HTTPWebSockets 来实现。
    2. 如果您不想将消息存储在服务器中,那么您应该在用于发送消息的设备中实现某种持久缓存。这与您的原始解决方案非常相似,除了不是将消息存储在数据库中,而是将它们存储在用户的设备上。这确实需要一些逻辑来检测何时收到消息,以及接收者何时重新连接,以触发发送丢失的消息。

    我认为第一种方法更适合一般用例,但这取决于您的用例。

    【讨论】:

    • 为什么不能从我的数据库中删除消息? @nadavvadan
    • 因为你没有保存用户的聊天记录。这取决于您的用例,但我想您希望将聊天历史记录保存在数据库中,以便其他设备/在用户删除数据后可以从同一设备访问信息。同样,它并不适用于所有应用程序,因此我将把我认为最常见的用例作为解决方案。
    • 并且消息队列可以在这种情况下替换数据库。例如,我可以使用 RabbitMQ 而不是将消息存储在数据库中吗?
    • 我明白你关于聊天记录的意思,它完全针对应用程序的上下文。感谢您的回复,很高兴我在正确的轨道上
    • 可以使用 RabbitMQ/ZeroMQ/Redis/其他消息队列。但是你的应用程序有必要吗?我不这么认为。尝试它可能很有趣,但除非您期望有大量流量,否则websockets 应该足够并且更易于配置,此外还支持 Web 浏览器(因此理论上您可以构建一个 Web 应用程序也适用于您的应用程序)。我可能会选择 WebSockets 和 DB。