V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
sunwei0325
V2EX  ›  Go 编程语言

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

  •  
  •   sunwei0325 · 2019-12-06 18:51:00 +08:00 · 7070 次点击
    这是一个创建于 1815 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景是上万台虚机上面的 agent, 需要实现自动更新, 然后重启生效.


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

    jpillora/overseer

    cloudflare/tableflip

    Teamwork/reload

    cespare/reflex

    oxequa/realize

    inconshreveable/go-update

    rcrowley/goagain

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

    弱弱问下,软重启是指?
    Master 进程这个应该是较好的方案,但是这种应该也会做不到业务不感知吧
    Moker
        17
    Moker  
       2019-12-12 15:05:24 +08:00
    @pythonee 作为 master 进程是知道目前有没子进程的可用,在没有可用的时候,就不把任务投递出去,设计上 master 进程可以使用 channel 来做一个小型队列。当监听到重启信号时,等待子进程执行完毕,然后推出,杀掉,重启,回到空闲进程池,业务上完全无感知,只是中间的这几个请求响应的时间会变高(具体取决于重启时间)。
    chennqqi
        18
    chennqqi  
       2019-12-16 10:02:49 +08:00
    @pythonee 了解一下 nginx reload 原理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:18 · PVG 08:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.