我有一个有状态的游戏应用程序,它部署在 Cloud Foundry 上。如果我更新应用程序,我需要正常关闭,即在所有正在运行的游戏完成之前不应停止旧版本。根据CF 文档,在发出cf stop
SIGTERM 后,应用程序只有 10 秒的时间关闭,然后应用程序被使用 SIGKILL 杀死。这在我的情况下不起作用。
我考虑过将状态推送到数据库或 Redis 之类的东西中,然后将正在运行的游戏热交换到新的应用程序实例,但由于我大量使用 Web Sockets,这似乎造成的问题比它解决的问题多,因为它也会打破现有的连接。
另一种解决方案是不发送cf stop
,而是向我的应用程序添加一个操作端点,例如POST /api/admin/stop
,这会使应用程序停止接受新游戏,然后在所有正在运行的游戏完成后自行关闭。
我的第三个选择可能是完全改变设计并使用像WebRTC这样的协议作为协议,这意味着应用程序将只提供静态资源,但在运行游戏时不再发挥积极作用,导致所有客户端直接相互连接通过服务器。不过,我在 WebRTC 方面没有经验,想知道该解决方案是否可靠,例如,如果某些用户使用 VPN。
现在我赞成第二种选择。但它应该是 CF 应用程序可以自行终止的方式吗?如果是的话,如何干净地做到这一点?
或者还有其他选择吗?最好的解决方案是什么?