多进程 fastapi ,一直用的是跑分网的部署方法,用 gunicorn 挂 uvicorn worker 启动。倒是没出过什么问题,因为我们以前压力一直不大,未来有点预期要上压力,我想起来这个好像有个坑来着。因为印象里以前看哪个大佬提过一嘴说 gunicorn 实际上只能启动但是进程挂了之后连重拉起功能都没有的,也不知道是不是属实。。。
1
zoranz 2023-03-10 17:47:54 +08:00
你有啥场景能把进程干爆啊
|
2
idblife 2023-03-10 17:54:34 +08:00
supervisord
|
3
paopjian 2023-03-10 19:29:54 +08:00
那就拿 supervisor 保护呗
|
4
echo1937 2023-03-10 20:44:09 +08:00
gunicorn 是 WSGI HTTP Server ,很类似 Java 里的 Tomcat ; Supervisor 则是 A Process Control System ,负责 monitor and control a number of processes ,你的进程挂了会帮你重新拉起来。以上都是他们官方文档摘抄的原文。
|
5
neoblackcap 2023-03-10 20:53:52 +08:00
现在而言,配置一下 systemd 就能守护好进程
|
6
LeeReamond OP |
7
lgh 2023-03-11 08:21:44 +08:00 via iPhone
子进程挂了会重启啊。不过我的是纯 gunicorn ,并没有下挂 uvicorn 。
|
8
ClericPy 2023-03-11 10:07:08 +08:00
Fastapi 以前自己服务器上就 uvicorn 直接起, 反正更新代码重启下就够了, 不开 --reload
公司服务器上也是 gunicorn + uvicorn, 主要用到 gunicorn 那个 HUP 信号无中断的热重启, 守护 systemd 就够了, supervisord 这么多年了也不知道当初那些小 bug 好了没有 现在在考虑 docker 那边怎么无中断热重启, 想丢 K8S 里面, 之前想的是 nginx 帮我转发多个端口的, 重启的时候一个个重启自动切流量, 不知道有什么更好办法没有. docker 里面走 gunicorn 就算接到 HUP, 但是代码是跟镜像走的... |
9
julyclyde 2023-03-11 11:18:55 +08:00
systemd 是唯一正确答案
supervisord 自己由谁守护还是个问题呢 |
10
SKYNE 2023-03-11 13:48:09 +08:00
容器化丢 k8s 里
|
11
LeeReamond OP @ClericPy 可能确实容器化+nginx 分流是比较合理的方案。寻思了一下,似乎直接 gunicorn 实现多节点也只有一行代码启动的优势,毕竟通信都靠中间服务了,可能细研究连方便也未必方便。
|
12
ClericPy 2023-03-11 21:04:33 +08:00
@LeeReamond nginx 我也是没办法, 但凡组里有个运维就研究研究 Istio 什么的了. 我就想知道个当前的版本答案, gunicorn 这套五年前就不流行了
|
13
LeeReamond OP @ClericPy 哈哈,老哥版本答案总结到位
|
14
fcfangcc 2023-03-13 17:06:14 +08:00
gunicorn 子进程挂了是会自动拉起的,不用担心
|
15
luzihang 2023-03-14 09:07:11 +08:00
pm2 也可以用用,比 supervisord 好看,好用
|
16
ClericPy 2023-03-14 18:54:50 +08:00
@LeeReamond 大哥, 我是来等新版本云原生的答案的...
|
18
ClericPy 2023-03-16 18:46:47 +08:00
@byaiu
流行云原生吧, 主要想抄个版本答案, 能达到和以前那套一样流量不丢失的就行. 我也求问啊... 现在想到的就是多实例切流量, 不然默认的实例重启会弄丢当前连接 不是专业后端, 所以想照抄个当下答案, 如果不是后端是脚本, 就随便重启了 |
19
ykb8121 2023-03-24 14:50:22 +08:00
systemd
|