Google 云 运行 应用程序上的用户会话是否定向到同一实例?

Are users sessions on Google Cloud Run apps directed to the same instance?

例如,

如果我的应用程序由 GCR 自动缩放,具有针对第三方身份提供商的 OAuth 2.0 + PKCE 授权代码流,我能否保证在用户登录第三方站点后重定向回来他们被重定向回同一个实例?

如果不是,则它们被重定向回的新实例将对 code_verifier 一无所知,并且身份验证将失败。

因为 Cloud Run is designed to run "stateless containers" 您不能依赖应用程序的内部状态。

您必须将信息保存到外部存储,以便任何实例都可以访问它。

云 运行 负载平衡不保证在用户的连续请求(即粘性会话)中登陆到同一实例。在这两个请求之间,容器可能已经崩溃、缩小并再次放大。

云 运行 容器应无状态。因此,如果您在应用程序中存储任何多步身份验证或会话 ID,则应将此类状态存储在外部存储(如 Cloud Memorystore、Redis、Memcached 或数据库)中。

身份验证和用户首选项的会话处理将无法在云 运行 或任何可扩展环境中按预期工作。

因为大多数应用程序都使用基于内存的实现来执行此功能。但是,此实现不适用于可以从多个实例提供服务的应用程序,因为记录在一个实例中的会话可能与其他实例不同。

因此您必须将其存储在所有实例都引用会话信息的位置。

对于云 运行 截至 2020 年 3 月的可用解决方案,

  • 你可以旋转起来Redis on Compute Engine(当然很贵!)

  • 您可以使用来自 Redis Labs

  • 的 Redis 实例
  • 您可以使用 Cloud Firestore。 (便宜,但不是有效的解决方案)

注意:Cloud Firestore 是一个持久的分布式事务数据库。通常,为会话选择不同的存储解决方案更为合适,例如 Memcache 或 Redis,因为它们的设计在此用例中提供了更快的操作。

这是一个带有 Nodejs 示例的文档:https://cloud.google.com/nodejs/getting-started/session-handling-with-firestore

对于其他已知的云 运行 到目前为止的限制。 check here

您需要外部数据存储,因为云 运行 是无状态的。

您可以使用 Upstash - 一种无服务器且持久的 Redis 服务 - 来保存您的会话数据。