【问题标题】:How do you manage websockets on an app that scales horizontally?您如何在水平扩展的应用程序上管理 websocket?
【发布时间】:2020-11-25 03:50:40
【问题描述】:

我有一个用 Golang 编写的应用程序,托管在 Google App Engine 上并使用 Firestore 作为后端。

Google App Engine 水平缩放。

我使用 Firebase 后端发送 websocket 消息。因此,用户连接到哪个 App Engine 实例并不重要。

每次用户进行身份验证时,都会创建一个 websocket 并提供在线用户列表。

在 Firestore 中,我只是将该用户的套接字连接时标记为“活动”,而当其断开连接时将其标记为“非活动”。

我的问题是应用程序崩溃(它发生了,即使它没有发生,我也需要为此做好计划。)所有通过 Web 套接字连接到 Go Server 的用户仍被标记为活跃。

网络客户端未连接到 Firebase。仅限 Go 服务器。

我无法在应用启动时将所有用户标记为非活动状态。因为 App Engine 加载更多实例可能会启动多个应用程序。如果我这样做了,在线的用户会因为负载而在新实例启动时被标记为离线。

如何解决此类问题?

【问题讨论】:

  • 更新了我的问题,以更清楚地说明 Web 客户端通过 Web 套接字连接。 Go 连接到 Firestore。 Web 客户端未连接到 Firestore。

标签: firebase go firebase-realtime-database google-cloud-firestore


【解决方案1】:

您的问题并不清楚,但听起来您希望客户端应用程序可以根据套接字的连接来管理活动状态。这根本行不通,部分原因是您在这里观察到,但也因为如果客户端完全失去连接,它也将无法更新后端的状态。

您应该从后端的角度使用 websocket 管理连接状态。它永远不应该失去连接。 (实际上,这就是实时数据库管理其presence 的方式。)

【讨论】:

  • 如果我理解你,那么我想我问的是相反的吗? Webclients 通过 websockets 连接到 go 应用程序。 Go 中间件处理所有逻辑和安全性。当 Go 应用程序崩溃/重新启动等时,它会使每个用户在其个人资料中保持“已连接”状态。因此,在这一点上,这是一个误报。所以我希望中间件(Go)可以处理这个。
  • 我认为你需要让你的中间件更耐崩溃来解决这个问题。
  • 问题不仅仅是崩溃。它正在使用 ctrl-c 重新启动应用程序并再次运行它。
  • 您应该捕获会终止进程的信号,包括 ctrl-c。 gobyexample.com/signals
【解决方案2】:

有一种方法可以通过在中间有一个监控服务器(app-[monitor]-firebase)定期监控应用程序的状态来更新数据库。

【讨论】:

  • 有什么例子可以链接到我吗?
猜你喜欢
  • 2015-05-22
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2011-09-11
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多