我是Go的新手,我在Heroku的应用程序中使用go例程,这些例程很长(最多7分钟),并且无法中断。 我看到自动定标器有时会杀死运行例程的Heroku dyno。我需要一种独立于dynos运行此例程的方法,所以我知道它不会被关闭。我阅读文章,但仍然不明白如何在后台工作程序中执行go例程。我很难相信我是唯一一个遇到这种情况的人。 我的例程使用我的redis数据库。
有人可以请一个例子来说明如何在heroku中设置后台工作人员以及如何将我的常规程序发送给该工作人员?
非常感谢
答案 0 :(得分:1)
我需要一种独立于dynos运行此例程的方法,所以我 知道它不会被关闭。
如果您不想在dyno上运行工作代码,那么您将需要使用Heroku的其他提供程序,如Amazon AWS,Digital Ocean,Linode等。
话虽如此,你应该设计你的工人,特别是那些关键任务的工人,能够从关机中恢复过来。要么能够继续他们离开的地方,要么重新开始。 Heroku的dyno管理员每天至少重启一次dynos,但如果其他云提供商偶尔也会重启他们的虚拟实例,可能不会每天重启一次,但仍然......我即使您决定部署也不会感到惊讶你的工作人员在你控制但永不关闭的物理机器上,你无法防止硬件故障或停电等事情发生。
如果你的工作人员需要执行某项任务直到完成,你需要让他们知道可能的关闭并让他们优雅地处理这些场景。当你的工人正在做它的工作时,不要依赖机器,物理或虚拟机器来继续运行。
例如,如果您使用Heroku,请使用worker dyno并让您的工作人员在您的工作人员收到此类信号之后收听SIGTERM
信号...
申请流程有30秒可以干净地关闭 (理想情况下,他们会比这更快地完成)。在这段时间 他们应该停止接受新的请求或工作并尝试完成 他们当前的请求,或将工作重新放回队列中供其他工作人员使用 处理的过程。如果在该时间段之后仍有任何进程, dyno经理将使用
SIGKILL
强行终止他们。
...继续阅读here。
但请记住,正如我之前提到的,如果发生停电并且Heroku发生故障,这种情况会不时发生,那么你的工人甚至不会有30秒的时间来清理。