求问 Golang Web 服务的自动重启方案

2020-10-29 15:29:16 +08:00
ksedz  ksedz
现在的 Web 服务由于一些 bug,会导致服务宕掉

自动的 recover 中间件等只能处理当前 goroutine 中的 panic,如果每个 goroutine 都要 recover 处理下就太麻烦了,而且也不能有效排除后续维护人员的偷懒或失误

看了一些相关模块,没有太满意的,期望的是像 supervisor 的那样的功能,但是不想用 python 包,也想用更轻量级的方案。

求问大家是怎么解决的。
3083 次点击
所在节点   Go 编程语言  Go 编程语言
21 条回复
susecjh
susecjh
2020-10-29 15:32:13 +08:00
docker
DoctorCat
DoctorCat
2020-10-29 15:40:13 +08:00
写个看门狗脚本,例如 kill YourGoService && ./YourGoService 然后 cronjob 定期运行一次
Maboroshii
Maboroshii
2020-10-29 15:40:57 +08:00
systemd
meshell
meshell
2020-10-29 15:43:41 +08:00
不可能用 supervisor 吗
676529483
676529483
2020-10-29 16:50:36 +08:00
虚机起就 systemd,容器就 docker --restart=always
coderxy
coderxy
2020-10-29 16:52:01 +08:00
docker 吧
wellsc
wellsc
2020-10-29 16:54:18 +08:00
systemd
zunceng
zunceng
2020-10-29 17:32:52 +08:00
你的 http 框架最好可以支持 HandleChain 这样可以实现一个 recover 的中间件

func HandleRecover(ctx webFrame.Context) {
ctx.Next()
if err := recover();err != nil {
// print err
}
}

然后把这个中间件加在 HandleChain 的第一个 就可以了

router.use(HandleRecover)

最简单的 直接用成熟的 http 框架 比如说 gin 自带 recover
dongisking
dongisking
2020-10-29 17:36:35 +08:00
最好的还是 systemd 和 docker
coderxy
coderxy
2020-10-29 17:40:16 +08:00
@zunceng 没用的,go 里面开启一个新的协程就得重新捕获,不然整个程序就会 crash 。而且你这个写的也不对,ctx.next()应该放在 recover 后面,而且还有放到 defer 里。不然 ctx.next()先执行,里面有 panic 你的程序就 crash 了
index90
index90
2020-10-29 17:45:33 +08:00
用进程守护就不怕中断服务中断吗?
MarksGui
MarksGui
2020-10-29 18:00:51 +08:00
@zunceng 在方法内部新开的 goroutine panic 是无法被统一的 recover 的。
cheng6563
cheng6563
2020-10-29 19:10:59 +08:00
写一个健康检查的接口。
外部用 systemd 或者 docker 之类的进行健康检查。
SingeeKing
SingeeKing
2020-10-29 20:18:46 +08:00
service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理
SingeeKing
SingeeKing
2020-10-29 20:21:28 +08:00
没细看,lz 是不是对 supervisor 有误解,supervisor 只是用 Python 写的,可以管理任何进程而不是只能管理 python 程序
janxin
janxin
2020-10-29 21:12:46 +08:00
你进程都崩了,很多信息会丢的,你确定这样没问题吗?
outoftimeerror
outoftimeerror
2020-10-29 21:15:08 +08:00
docker+k8s
freestyle
2020-10-29 21:18:13 +08:00
golang 版 supervisord,不需要 Python 环境,一个二进制文件加配置文件 https://github.com/ochinchina/supervisord
ArJun
2020-10-29 21:51:33 +08:00
docker 最好用
ericgui
2020-10-30 09:58:29 +08:00
@zunceng 重启还是要靠系统层面解决,比如内存泄露咋办,这 recover 就没用了,平时每次执行都 if else 一下,其实浪费性能

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

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

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

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

© 2021 V2EX