【问题标题】:Real time communication between clients via websocket server on Google App Engine客户端之间通过 Google App Engine 上的 websocket 服务器进行实时通信
【发布时间】:2023-04-01 23:55:02
【问题描述】:

This 文章描述了用于聊天应用程序的 websocket 服务器的外观。我们正计划实施类似的东西;当消息发送到服务器时,它会根据身份验证令牌发送给正确的收件人,并且消息会保存在 mysql 数据库中。

我们最终会将服务器托管在 Google App Engine 上,我怀疑这会导致上述方法出现一些问题,因为这取决于所有客户端都连接到同一服务器,而这可能不是案例,因为将根据需要创建多个实例。有没有办法连接所有实例,这样就不会出现问题(Pub/Sub 可能吗?(但这会导致额外费用)),还是我们应该找到不同的解决方案?

我的一个想法是使用mysql-events 来监视来自 websocket 服务器的 binlog,以便在消息表中创建新行,但我在某个地方读到了不推荐的内容。但我找不到我在哪里读到的,也许这是最好的解决方案。

【问题讨论】:

  • 这个问题每周出现几次...... Mysql 是一个关系数据库,而不是消息代理或消息队列。使用为此目的而设计的东西,如 redis 或 rabbitmq,或 gcp 提供的消息代理解决方案之一。
  • 很抱歉。我试图搜索类似的问题,但我没有找到任何问题。也许我应该扩大我的搜索范围...无论如何感谢您的建议!

标签: mysql node.js google-app-engine google-cloud-platform websocket


【解决方案1】:

既然您询问了其他解决方案,我建议您查看 Firebase,特别是实时数据库。它提供了开箱即用的所有功能,您可以在连接的客户端之间进行实时通信,并为未连接的客户端提供云消息传递。

Here's a tutorial 使用 Firestore 创建实时聊天 Web 应用程序,但只需稍作修改即可将其应用于实时数据库。我这么说是因为 Firestore 的写入成本很高,在我看来这使得它不适合聊天后端。

【讨论】:

  • 我们之前曾将 Firestore 用于类似的项目,并且效果很好。由于我们需要拥有多个数据库的能力,因此实时数据库似乎是一个不错的选择。我有点希望我们可以将消息传递部分与其他所有内容保存在同一个数据库中,但我知道这将是多么困难
  • 在多个项目中,我使用 RTDB 作为表示层,其中后端关系数据库充当真实存储,并且将一些数据添加到 RTDB 以在前端显示。考虑状态定期更新的长时间处理作业。使用 RTDB 可以轻松地实时显示状态变化。
  • 这是个好主意。你认为我可以在 websocket 服务器上监听 RTDB 的更新,然后通过它通知用户吗?那我会和 Firebase 战斗吗?将 RTDB 直接连接到应用程序会更好吗?
  • 恐怕我不明白这个架构中websocket服务器的目的是什么。如果您的目标是将聊天保存到 MySQL 数据库的聊天应用程序,我会像在该教程中那样设置应用程序,然后创建一个 RTDB 触发器,该触发器会在每次更新 MySQL 数据库的更改时触发。 RTDB 处理连接客户端的实时推送更新,因此不知道 websocket 服务器的位置。祝你好运!
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多