现在的需求是,开发完了一个新功能,需要部署到生产。
我要如何在生产所有的请求处理完了之后,再进行部署重启 flask 服务? (优雅关闭?)
因为如果直接部署,那么生产的请求肯定是会报错出现异常的。为了避免这种情况。请在座的各位大佬帮帮我这个萌新!
我要如何在生产所有的请求处理完了之后,再进行部署重启 flask 服务? (优雅关闭?)
因为如果直接部署,那么生产的请求肯定是会报错出现异常的。为了避免这种情况。请在座的各位大佬帮帮我这个萌新!
1
youngs Nov 20, 2019
126 天前就已经是萌新了,现在还叫萌新
|
3
scukmh Nov 20, 2019
用 ha 呀。
|
5
monsterxx03 Nov 20, 2019
gunicorn, kill -HUP
|
6
eteryao OP @monsterxx03 我们部署没有使用 gunicorn 这点我忘说了 我们是用 docker 进行部署的。
|
7
feiniu Nov 20, 2019 via iPhone 凌晨三点更新,
我乱说的 |
8
Vegetable Nov 20, 2019
你用什么部署不重要,这个还是要看你用了什么 wsgi 程序,gunicorn or uwsgi?
https://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html 读一下这个看看, 还有 gunicorn 的文档 https://docs.gunicorn.org/en/stable/faq.html#how-do-i-reload-my-application-in-gunicorn ,这个我不确定是不是会等待程序结束 一个比较蠢的办法时修改 nginx 配置,重新启动一个端口提供变更后的服务,让后 nginx -s reload,nginx 会处理好连接 |
10
XiaoxiaoPu Nov 20, 2019
前面用 nginx 等类似的负载均衡,后面接至少两个 flask 实例,每次部署时,先在负载均衡上摘掉一个,等待活跃请求完成后,重启这个实例,重启完成后再把这个实例加回去,然后再用同样的方式操作下一个实例。
|
11
eteryao OP |
12
andylsr Nov 20, 2019 via Android
楼上凌晨 3 点停机更新可能是最佳方案😂
|
14
8kFT2l6aoU9566Bg Nov 20, 2019 via Android
@eteryao 生产环境就不是这样部署的,gunicorn 跟 uwsgi 是必须的吧,无论你是否用 Docker。提前通知用户,凌晨闲时更新即可,为啥非要“优雅”关闭?
|
16
Cat73 Nov 20, 2019
拿 Nginx 处理下就好
|
17
Vegetable Nov 20, 2019
@eteryao #11 你这等于时用了 flask 自带的服务器,这个应该只在开发环境使用,性能比较差也不够稳定,用这个服务器的话,你还真就只能用两个 docker 实例+两个内部端口+nginx 去做了,因为这个服务器本身没有提供这个 zero downtime 的功能.
|
18
cz5424 Nov 20, 2019 via iPhone
不建议使用 flask 自带的,楼上已经给了很多方案了,比如 gunicorn 热重启
|
19
cz5424 Nov 20, 2019 via iPhone
我这边是使用 Gunicorn 的,重启命令
docker exec -it 容器名字 kill -s HUP 1 |
22
45HXlKzal6W56zUJ Nov 20, 2019
|
23
runtu2019 Nov 20, 2019
shell 脚本几行搞定的事情,监听服务端口的连接情况,端口没有 tcp 连接执行重启,用 crontab 重复执行脚本即可
|
24
fml87 Nov 20, 2019
就算 uwsgi/gunicorn/nginx 可以安全热重启,通常也无法说服领导在生产环境热重启,所以半夜停服重启基本是方案
|
26
evlos Nov 21, 2019 via iPhone
Zero downtime deployment
|
27
petelin Nov 25, 2019 via iPhone
先摘机器 然后看机器上的请求什么时候都处理完了
后一点 python 做及其难 go 就简单多了 所以基本所有的 go 服务都自带 gracefulshutdown。python 里有这词吗? |