Google App Engine 和 Socket.IO 上的移动聊天应用程序

Posted

技术标签:

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

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

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

这是我的方法:

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

这是一个正确的方法吗?

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

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

以上是关于Google App Engine 和 Socket.IO 上的移动聊天应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine Flexible 和 Google Container Engine 之间的区别?

sql GQL - Alternativa和没有Google App Engine一样

Google App Engine 和 404 错误

如何在 Google Cloud Functions 和 Google App Engine 之间进行选择?

App Engine 和 Google 游戏服务 clientId 冲突

Google Cloud Tasks 和 Google App Engine Python 3