2019 年末 golang 服务端进程自动更新重启的最佳姿势是什么?

2019-12-06 18:51:00 +08:00
 sunwei0325
场景是上万台虚机上面的 agent, 需要实现自动更新, 然后重启生效.


看了一下社区的方案大概有如下这些:

jpillora/overseer

cloudflare/tableflip

Teamwork/reload

cespare/reflex

oxequa/realize

inconshreveable/go-update

rcrowley/goagain

不知道大家有没有这方面的经验? 谢谢
7096 次点击
所在节点    Go 编程语言
18 条回复
forrestshuang
2019-12-06 19:13:02 +08:00
fresh?
qinghon
2019-12-06 20:13:25 +08:00
systemd?
比自己实现稳多了
chennqqi
2019-12-06 20:26:11 +08:00
@qinghon systemd 不是解决方案,systemd 就是 kill restart,关键还是要在自己程序中捕获信号并支持软重启、热重启。
Moker
2019-12-06 20:36:38 +08:00
master 进程管理 主进程负责整体的调度和任务分配 启动子进程处理 需要更新的部分放到子进程上
具体可以根据自己的业务调整
Moker
2019-12-06 20:37:35 +08:00
如果只是任务上报 允许丢失或者短暂不可用的 那么 restart 也没啥问题
yinheli
2019-12-07 00:43:41 +08:00
之前是 grace github.com/facebookarchive/grace
现在大部分都换到了 tableflip
ifaii
2019-12-07 07:42:28 +08:00
…… 容器滚动
hpu423
2019-12-07 10:28:05 +08:00
supervisor
iRiven
2019-12-07 10:36:51 +08:00
@chennqqi systemd 可以捕获到杀进程信号,没捕获到可能是没配置好,我也觉得 systemd 比较妥。
iRiven
2019-12-07 10:37:28 +08:00
@chennqqi 呃呃看错了,打扰了
guonaihong
2019-12-07 13:36:13 +08:00
用的是容器。
moonsn
2019-12-07 14:03:04 +08:00
看原理,结合业务特性自己实现。
HuHui
2019-12-07 14:55:52 +08:00
这不是 k8s 典型的应用场景么?
reus
2019-12-08 08:00:52 +08:00
发个消息让它自杀,然后让 systemd 之类的重启。热更新就算了吧。
chennqqi
2019-12-09 10:46:27 +08:00
cloudflare 的那个库不支持 windows
pythonee
2019-12-11 23:00:50 +08:00
@chennqqi
@Moker

弱弱问下,软重启是指?
Master 进程这个应该是较好的方案,但是这种应该也会做不到业务不感知吧
Moker
2019-12-12 15:05:24 +08:00
@pythonee 作为 master 进程是知道目前有没子进程的可用,在没有可用的时候,就不把任务投递出去,设计上 master 进程可以使用 channel 来做一个小型队列。当监听到重启信号时,等待子进程执行完毕,然后推出,杀掉,重启,回到空闲进程池,业务上完全无感知,只是中间的这几个请求响应的时间会变高(具体取决于重启时间)。
chennqqi
2019-12-16 10:02:49 +08:00
@pythonee 了解一下 nginx reload 原理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626641

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX