我在使用CloudFoundry方面并没有真正的经验。我知道如何使用它将服务连接到应用程序,以及推送战争、日志文件等。所以是标准的东西。但当谈到CloudFoundry的配置和行为时,我的知识就到此为止了。
我的问题是,在我的应用程序启动和New Relic完成后,它就记录了它用作收集器等的内容。CloudFoundry Cell正在停止实例。我使用spring集成,因为关闭jvm的信号,它会关闭所有东西。我还为一些工作禁用了数据库中的几个布尔值。这一切都在起作用,直到现在一切都很好。
一旦一切关闭,CloudFoundry就开始销毁当前实例的容器。之后,日志记录显示销毁成功。但该应用程序和实例一样仍在运行。我的应用程序仍在不时地记录一些事情(不是关闭的作业(,该实例似乎仍然存在,并且不是"关闭";更新";。
有人知道为什么会发生这种事吗?我是否必须在spring中实现一些东西来阻止实例被破坏?或者这是我需要进行的CloudFoundry配置?
一件奇怪的事情是,它只发生在同龄人的一周。每周三晚上到周四早上。几乎在同一时间。
编辑:这是我删除所有敏感信息的日志
Some logs which indicate that the app is still running as expected.
// I think this is the part where i gets interesting.
2020-07-09T00:44:09.87+0200 [CELL/0] OUT Cell XXX requesting replacement for instance XXX
2020-07-09T00:44:10.37+0200 [CELL/0] OUT Cell XXX creating container for instance XXX
2020-07-09T00:44:12.17+0200 [CELL/0] OUT Cell XXX successfully created container for instance XXX
Downloading droplet, starting the application and notice that it was shutted down unexpectedly. The indication for that is a flag in the database that hasn't been set to true which would happen during a proper shutdown.
2020-07-09T00:45:14.70+0200 [CELL/0] OUT Container became healthy
Some New Relic information which are not important for this question.
2020-07-09T00:45:19.94+0200 [CELL/0] OUT Cell XXX stopping instance XXX
This is the part where the application shuts down it's listeners and jobs.
2020-07-09T00:45:25.70+0200 [APP/PROC/WEB/0] OUT Exit status 143
2020-07-09T00:45:25.70+0200 [CELL/0] OUT Cell XXX destroying container for instance XXX
2020-07-09T00:45:25.88+0200 [PROXY/0] OUT Exit status 137
2020-07-09T00:45:26.07+0200 [CELL/0] OUT Cell XXX successfully destroyed container for instance XXX
2020-07-09T00:49:36.17+0200 [APP/PROC/WEB/0] OUT 2020-07-09T00:49:36,178+0200 Some log entry which indicates that the app is still alive
完成后,应用程序仍在运行(在此期间没有重新启动(,可以通过将关闭挂钩代码中设置为false的标志设置为true来重新启动所有作业,这样在应用程序关闭时就不会启动新作业。
我现在知道问题出在哪里了。感谢一位同事,当他看到日志时,他清楚地知道发生了什么。
CloudFoundry正在创建一个新实例,然后再销毁旧实例以避免宕机。一旦新实例运行正常,它就会销毁旧实例。在新实例上运行的应用程序仍然接收旧实例的关闭信号,并执行关闭挂钩中的代码。这意味着当应用程序关闭时,标志将设置为false以停止所有作业。
为了避免这种情况,使用实例ID是很重要的。每个作业都需要获取其运行的实例的id。当新实例启动时,必须在作业表中覆盖实例id。因此,作业在新实例上运行,而不是在旧实例上运行。