我在 App Engine flex 实例上的 Go 中有一个长时间运行的进程,通过 docker 镜像部署。
大多数情况下,当我部署到实时版本时,它会向应用程序发送 SIGTERM。我可以捕获此消息并正常关闭。这很棒。
其他时候,该过程似乎消失了,并创建了一个新实例。我没有收到任何日志输出;没有迹象表明发生了什么。如果我更改实例数量(通过 manual_scaling),这肯定会发生,但有时它会在正常部署中发生。
有没有办法持续获得 SIGTERM?我可以使用其他策略来了解实例何时被终止/重新启动?
更新:我尝试了一些测试用例:
- 在 App Engine 用户界面中“删除”实例。该实例已完全关闭(发送信号)并重新启动,因为它已配置为只有一个实例。
- 部署,从 1 个实例更改为 2 个实例。现有实例已通过信号干净地重启。新实例已出现。
- 部署,将 2 个实例更改为 1 个实例。一个现有实例已通过信号干净地重启。另一个实例噗——因为没有更好的描述。查看显示来自我的应用程序的 STDERR 的“所有日志”,然后什么都没有。vm.events、vm.syslog、vm.shutdown 日志中没有输出,这些日志报告了重启期间许多有趣的内容。我还知道我的应用程序没有收到信号,因为数据库处于脏状态。
最后一个案例,我希望得到更多见解,谢谢!如果有更好的地方或方式来提问,也请告诉我。
答案1
在 App Engine 上,Flex 实例每周重启一次在运行时应用关键更新。
此重启总会在重启完成前 3 秒收到 SIGTERM 和 SIGKILL。
如果您的应用有进程长时间运行,每周重启可能会影响它们。一个不错的选择是在 Compute Engine 上运行它,因为这些进程对用户来说更可控,而且不会每周重启。
我刚刚复制并可以确认:
- 重新部署 1 对 1 发送 SIGTERM 和 SIGKILL
- 每周重启时都会发送 SIGTERM 和 SIGKILL
- 重新部署不断增加的实例,发送 SIGTERM 和 SIGKILL
- 重新部署减少实例(2 到 1)我可以看到每个实例都发送了 SIGTERM 和 SIGKILL。
此日志是在日志中生成的:appengine.googleapis.com/vm.shutdown
因此,如果您想继续使用 App Engine,您可以等待此信号,这将在实际关闭完成前给您 3 秒钟的时间。