我正在使用 Cloud Run 托管 Python FastAPI 应用程序。当建立 WebSocket 连接时,我将该连接存储在字典中。为了保证线程安全,我在修改字典时使用了asyncio.Lock。
但是,当 Cloud Run 实例从冷启动启动时,我遇到了问题。添加连接后,字典立即显示为空,即使我在此过程中记录了字典状态。这是我的日志片段:
2025-01-14 20:32:14.272 欧洲中部时间
添加了与房间的连接:{'11d6a207-1700-466f-b32c-a880a32905b8':{'36054a0d-cfbd-4283-b836-c3de613c2778':
2025-01-14 20:32:14.272 欧洲中部时间 add_connection结束锁
2025-01-14 20:32:14.484(欧洲中部时间) 获取房间{}
Cloud Run 实例预热后(即冷启动后),一切都会按预期运行,并且字典会正常运行。
我怀疑此问题可能与 Cloud Run 在冷启动期间的配置或行为有关。我使用 asyncio.Lock 来避免竞争条件,所以我认为并发不是问题。
我的问题:
Cloud Run 冷启动期间跨请求维护内存中状态是否存在已知问题?
我是否应该考虑更改我的配置(例如,在第一代和第二代 Cloud Run 之间切换)?
这可能是有意的冷启动行为。 Websocket 在将数据同步到 Cloud Run 时通常会遇到挑战,因为实例是无状态的,而 Websocket 是有状态的。
在选择第一代和第二代Cloud Run时,一旦实例终止或缩小规模,两者仍然会丢弃内存中的数据。但就冷启动时间而言,第一代的冷启动时间比第二代更快。
您还可以尝试设置最小实例数来减少冷启动时间。