如何在Python开发的Cloud Run实例之间共享全局字典变量?
可行的轻量解决方案
方案1:开启Cloud Run会话亲和性(改造成本最低)
这是目前不需要改动业务代码就能解决问题的最优方案:
- 直接在Cloud Run服务的配置页开启会话亲和性功能,开启后同一用户的连续请求会被固定路由到同一个处理实例,你的回调请求就会落到之前存储了对应
session_id数据的实例上,不需要跨实例共享数据 - 注意事项:仅适合登录回调流程耗时较短的场景(建议控制在30分钟以内),如果实例因为缩容、故障被销毁,内存中的数据依然会丢失,不适合需要长时间存储的会话数据
方案2:用Cloud Storage存储临时KV数据(轻量无服务器)
比数据库方案轻量很多,不需要维护任何服务实例:
- 新建一个GCS存储桶,设置生命周期规则,自动删除创建时间超过1小时的文件,避免冗余存储
- 把原来写入全局
runtimes字典的逻辑,改成将对应session_id的关联数据序列化为JSON,写入GCS桶中以session_id命名的文件 - 回调时直接读取GCS中对应
session_id的文件反序列化即可,小流量场景下存储和读写成本几乎为0
方案3:使用Cloud Firestore 原生模式(兼容KV读写逻辑)
如果你的会话数据需要更高的可靠性,这个方案比传统数据库轻量得多:
- Firestore是全托管Serverless KV数据库,不需要维护实例、配置扩容,按实际读写量付费,低用量场景完全免费
- 读写逻辑和你现在用字典的逻辑几乎一致,只需要把
runtimes[session_id]的读写操作替换为Firestore对应文档的读写接口即可,代码改动量极小
额外提醒:即使Cloud Run不扩容多实例,实例本身也会因为空闲、资源调度等原因被系统自动回收,存在内存中的全局变量数据随时可能丢失,原本的内存存储方案本身就不适合生产环境使用。
内容的提问来源于stack exchange,提问作者Karas
相关产品推荐
相关产品推荐

