公司的 web 项目怎么实现热更新,不需要停服就能实现发版 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
longmeier90
V2EX    Python

公司的 web 项目怎么实现热更新,不需要停服就能实现发版

  •  
  •   longmeier90 2021-07-06 18:33:42 +08:00 6674 次点击
    这是一个创建于 1603 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前用户少都是公司内部人使用,随便新增一个什么功能,直接就是拉一下代码,重启 web 服务也没问题。最近公司使用的人多了以后,发现这种方式不太适用啦。 我就想有用什么方式改造一下能够实现热更新或者是发版不停服,让用户无感知发版。难道是启动两套服务,做个负载,一个一个的重启?没这样搞过,不知道这种模式会不会有什么坑之类的,或者有什么更好的实现方法没有。 各位大佬给个建议!```
    第 1 条附言    2021-07-07 10:21:47 +08:00
    俺们公司项目目前是用的 linux+django+supervisor+gunicorn 架构
    24 条回复    2021-07-07 19:51:18 +08:00
    chogath
        1
    chogath  
       2021-07-06 18:57:15 +08:00
    服务器部署可以用 pm2,集群可以靠谱部署 k8s 做滚动更新或者其他策略
    no1xsyzy
        2
    no1xsyzy  
       2021-07-06 18:57:16 +08:00
    我这边有一个就是直接起两个服务做负载均衡分别重启。

    当然也有只需要起一个服务并且在重启过程中阻塞保持现有链接的。
    gunicorn 的自动重载应当是支持这样操作的,但它可以作为攻击面,小心使用。

    更好当然是 k8s 及其轻量替代品,但就是轻量替代品可能都嫌重。
    arischow
        3
    arischow  
       2021-07-06 19:16:33 +08:00 via iPhone
    负载均衡,检查服务健康,注册 /反注册服务,可以用 Ansible 类似的工具做。

    我用 Kubernetes
    mkdir
        4
    mkdir  
       2021-07-06 19:34:12 +08:00
    来了来了,K8S 替代品 docker swarm,滚动发布,操作简单
    DeWjjj
        5
    DeWjjj  
    PRO
       2021-07-06 19:43:38 +08:00
    启用两套服务,然后主从数据库做交接。
    securityCoding
        6
    securityCoding  
       2021-07-06 19:45:11 +08:00
    k8s 正解,现在都是云服务器直接用云服务商的集群就好
    netwjx
        7
    netwjx  
       2021-07-06 21:45:10 +08:00
    前置 nginx, 后面放个集群, 至少 2 台
    手动切集群
    luoqeng
        8
    luoqeng  
       2021-07-06 22:03:50 +08:00
    web 都是无状态服务,没啥可热更新的
    akira
        9
    akira  
       2021-07-06 22:47:40 +08:00
    理论上只需要 3 步 :dodge
    1. 启动新服务
    2. 新流量切换到新服务
    3. 关闭旧服务
    myd
        10
    myd  
       2021-07-06 22:55:24 +08:00
    数据库的更新呢
    kingfalse
        11
    kingfalse  
       2021-07-07 08:03:18 +08:00 via Android
    rancher 一把梭子 over
    finian
        12
    finian  
       2021-07-07 08:58:37 +08:00   1
    搜 graceful shutdown
    vueli
        13
    vueli  
       2021-07-07 09:12:00 +08:00
    web 项目? 是前后端分离的还是怎么样的.
    longmeier90
        14
    longmeier90  
    OP
       2021-07-07 09:23:57 +08:00
    @vueli 嗯,前后端分离的项目
    lele88lala
        15
    lele88lala  
       2021-07-07 10:32:56 +08:00
    不好意思打扰了,你们都是怎么发帖子的,为什么我发不了呢?
    ClericPy
        16
    ClericPy  
       2021-07-07 10:37:55 +08:00
    以前 Gunicorn 用的 HUP 信号, 这算热更新么

    Reload the configuration
    The HUP signal can be used to reload the Gunicorn configuration on the fly. Sending a HUP signal will reload the configuration, start the new worker processes with a new configuration and gracefully shutdown older workers.

    现在一直 uvicorn 没找到类似的, 估计也要依赖 Gunicorn worker 来整
    hb751968840
        17
    hb751968840  
       2021-07-07 10:43:26 +08:00
    要有集群
    jorneyr
        18
    jorneyr  
       2021-07-07 11:02:02 +08:00
    轮流升级也有坑: 例如计算数值的 Api:
    旧版: 1+1 返回 3
    新版: 1+1 返回 2
    使用负载的时候,新旧版同时存在,同一个接口调用因为负载返回 2 个不同结果。
    binbin0915
        19
    binbin0915  
       2021-07-07 11:19:54 +08:00
    php 吧 随便替换...
    abersheeran
        20
    abersheeran  
       2021-07-07 13:45:41 +08:00
    @ClericPy uvicorn 没考虑过做这个功能,gunicorn+uvicorn worker 搭配就行了。
    ClericPy
        21
    ClericPy  
       2021-07-07 14:17:01 +08:00
    @abersheeran 是, 不过我很多时候懒得装 gunicorn, 所以自己 handle signal 然后外面用 systemd 守护, 或者直接用 uvicorn 自带的 reload. 就赌不会那么导致重启一刹那正好有个请求没接到...

    gunicorn 的 HUP 信号算热重启么, 会有几率丢请求么. 非后端不确定有没有什么靠谱点的办法, 一开始以为 nginx 会在程序重启的时候帮我 hold 住结果直接给人返回了 502... 前东家除了 HUP 信号, 还有几个操作就是靠的 nginx upstream 的负载均衡, 每次重启服务一台一台重启让坏节点自动被另一个节点接管
    abersheeran
        22
    abersheeran  
       2021-07-07 14:44:42 +08:00   1
    @ClericPy https://github.com/index-py/index.py/blob/master/indexpy/cli.py#L206 我也比较懒,直接封装了 gunicorn 和 uvicorn 的操作,对外暴露的使用方式一致。我每次用的时候只要改 index-cli [uvicorn|gunicorn] ....... 中间的部分就可以无缝切换了。
    ruanimal
        23
    ruanimal  
       2021-07-07 16:45:02 +08:00
    @ClericPy 还是 lvs 靠谱点
    YangWaleed
        24
    YangWaleed  
       2021-07-07 19:51:18 +08:00
    换 erlang 吧( doge
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:54 PVG 08:54 LAX 16:54 JFK 19:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86