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

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

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