• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

大佬们 go 更新版本的时候文件锁怎么解决的?

  •  
  •   imherer · Dec 19, 2018 · 2939 views
    This topic created in 2731 days ago, the information mentioned may be changed or developed.
    “文件锁” 这个词不知道用的准不准确,我也是在别处听说的

    现在有这么一个场景:

    假如我用 go 写了一个 web 服务,当需要版本更新的时候需要替换当前服务器的文件,但是必须得停掉服务才能上传更新,而且 go 编译出来的文件还挺大的,上传到服务器所需时间几秒到几十秒不等

    像 Python、Node.js ,它更新是直接可以上传覆盖的,需要重启服务后更新的才生效,而这个重启时间很短,1s 不到,用户那端几乎是无感知的

    大佬们是如何解决的呢?
    18 replies    2018-12-19 13:17:59 +08:00
    0987363
        1
    0987363  
       Dec 19, 2018 via Android   ❤️ 1
    上传到缓存目录,然后停止服务,然后替换,然后启动服务,用脚本一次性搞定
    ikaros
        2
    ikaros  
       Dec 19, 2018   ❤️ 1
    你先上传到 home 下面,然后 mv 过去覆盖源程序,然后 supervisor restart 一下也就不到 1s 吧?
    Aliencn
        3
    Aliencn  
       Dec 19, 2018   ❤️ 1
    1 楼说的适用于 Windows 和 Linux 系统。
    2 楼说的适用于 Linux 系统。
    misaka19000
        4
    misaka19000  
       Dec 19, 2018   ❤️ 2
    最好的做法当然是起多个服务进程然后依次更新以此来保证服务不会中断
    mogita
        5
    mogita  
       Dec 19, 2018 via iPhone   ❤️ 1
    ELB。单机不可能确保没有 downtime。
    pkookp8
        6
    pkookp8  
       Dec 19, 2018 via Android   ❤️ 1
    mv 到临时目录
    kill 原进程
    启动临时目录进程
    cp 到原目录覆盖
    kill 临时进程
    启动原目录进程

    linux 可以省略前三步,因为 linux 不存在运行的进程文件不能操作的问题
    yuikns
        7
    yuikns  
       Dec 19, 2018 via iPhone   ❤️ 1
    docker 直接顶掉不就行了?
    reus
        8
    reus  
       Dec 19, 2018   ❤️ 1
    上传时用另外的名字,不要直接覆盖,上传完了,再 mv
    gamexg
        9
    gamexg  
       Dec 19, 2018
    linux 即使程序运行着也可以删除、改名。
    windows 下即使运行着也是可以改名。
    zhengxiaowai
        10
    zhengxiaowai  
       Dec 19, 2018
    一般来说有些语言支持热替换的比如 erlang,python 通过 hack 方式也能支持。

    对于一般情况来说,如果你部署了多实例,用 nginx 反代的话,可以几个几个重启更新,nginx 会自己打到正常的服务下面,现在 docker 都是那么做的。如果你是单实例,那么 build 好之后,关闭当前重启新服务也是很快的
    zjsxwc
        11
    zjsxwc  
       Dec 19, 2018
    nginx 灰度发布+1
    kappa
        12
    kappa  
       Dec 19, 2018
    loveCoding
        13
    loveCoding  
       Dec 19, 2018
    负载均衡 + 持续集成 ,比较有代表性的就是 nginx + jenkins .完全没锁的概念
    fcten
        14
    fcten  
       Dec 19, 2018
    用软连接启动,更新服务后修改软连接的地址然后重启。

    想要完全无缝的话就用 nginx 反代。
    qiyuey
        15
    qiyuey  
       Dec 19, 2018 via Android
    这是典型的平滑发布问题,无论替换多快总会有空洞期,热替换局限性比较大,正确做法是部署前主动进行当前机器的服务下线,部署成功后主动进行当前机器的服务上线。
    huoru
        16
    huoru  
       Dec 19, 2018
    最好的应该是:
    旧的 A 程序 与 旧的 B 程序同时运行,nginx 的 upstream 改对应的后端,reload。
    AlphaTr
        17
    AlphaTr  
       Dec 19, 2018 via iPhone
    关键词 Graceful Restart,有很多实现的
    6ufq0VLZn0DDkL80
        18
    6ufq0VLZn0DDkL80  
       Dec 19, 2018
    服务发现加滚动更新加优雅退出?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   920 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 20:55 · PVG 04:55 · LAX 13:55 · JFK 16:55
    ♥ Do have faith in what you're doing.