The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
ksedz

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

  •  
  •   ksedz · Oct 29, 2020 · 4083 views
    This topic created in 2195 days ago, the information mentioned may be changed or developed.
    现在的 Web 服务由于一些 bug,会导致服务宕掉

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

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

    求问大家是怎么解决的。
    Supplement 1  ·  Oct 30, 2020
    感谢各位的建议,目前生产环境不是 docker,这个方案不能用了。

    go 版本的 supervisor 是我最初希望的答案,不过现在看来,systemd 才是正途。
    21 replies  •  2020-11-27 18:04:26 +08:00
    darylc
    darylc
    Oct 29, 2020
    1
    docker
    DoctorCat
    DoctorCat
    Oct 29, 2020
    2
    写个看门狗脚本,例如 kill YourGoService && ./YourGoService 然后 cronjob 定期运行一次
    Maboroshii
    Maboroshii
    Oct 29, 2020❤️1
    3
    systemd
    meshell
    meshell
    Oct 29, 2020
    4
    不可能用 supervisor 吗
    676529483
    676529483
    Oct 29, 2020
    5
    虚机起就 systemd,容器就 docker --restart=always
    coderxy
    coderxy
    Oct 29, 2020
    6
    docker 吧
    wellsc
    wellsc
    Oct 29, 2020
    7
    systemd
    zunceng
    zunceng
    Oct 29, 2020
    8
    你的 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
    Oct 29, 2020
    9
    最好的还是 systemd 和 docker
    coderxy
    coderxy
    Oct 29, 2020
    10
    @zunceng 没用的,go 里面开启一个新的协程就得重新捕获,不然整个程序就会 crash 。而且你这个写的也不对,ctx.next()应该放在 recover 后面,而且还有放到 defer 里。不然 ctx.next()先执行,里面有 panic 你的程序就 crash 了
    index90
    index90
    Oct 29, 2020
    11
    用进程守护就不怕中断服务中断吗?
    MarksGui
    MarksGui
    Oct 29, 2020
    12
    @zunceng 在方法内部新开的 goroutine panic 是无法被统一的 recover 的。
    cheng6563
    cheng6563
    Oct 29, 2020 via Android
    13
    写一个健康检查的接口。
    外部用 systemd 或者 docker 之类的进行健康检查。
    SingeeKing
    SingeeKing
    Oct 29, 2020
    14
    service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理
    SingeeKing
    SingeeKing
    Oct 29, 2020
    15
    没细看,lz 是不是对 supervisor 有误解,supervisor 只是用 Python 写的,可以管理任何进程而不是只能管理 python 程序
    janxin
    janxin
    Oct 29, 2020
    16
    你进程都崩了,很多信息会丢的,你确定这样没问题吗?
    outoftimeerror
    outoftimeerror
    Oct 29, 2020
    17
    docker+k8s
    freestyle
    freestyle
    Oct 29, 2020 via iPhone
    18
    golang 版 supervisord,不需要 Python 环境,一个二进制文件加配置文件 https://github.com/ochinchina/supervisord
    ArJun
    ArJun
    Oct 29, 2020
    19
    docker 最好用
    ericgui
    ericgui
    Oct 30, 2020
    20
    @zunceng 重启还是要靠系统层面解决,比如内存泄露咋办,这 recover 就没用了,平时每次执行都 if else 一下,其实浪费性能
    sunshinev
    sunshinev
    Nov 27, 2020
    21
    supervisored 啊,好使~
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5045 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 06:53 · PVG 14:53 · LAX 22:53 · JFK 01:53
    ♥ Do have faith in what you're doing.