发布版本安全更替方案咨询

zxyfaxcn

问题描述

环境:阿里云 alb 、2台 ecs
项目:web http 接口
目标:实现代码发版安全重启更替

为此你搜索到了哪些方案及不适用的原因

目前想到的方案有三种:
1 alb -> nginx -> webman
设置nginx stream, 定义两个服务端口用于更替
发版时,同步最新代码,启动新服务,更新stream,重启nginx, 停止旧服务

2 alb -> webman
通过调用阿里云 alb 接口,实现上、下服务(定义两个服务端口用于更替),启、停服务

3 alb -> webman
基于 reusePort + Master进程ID,上线代码时,取得并记录当前进程ID,启动新服务,基于记录的旧PID停止旧服务。

请问,上面三种是否都可行,要确保服务高可用且兼顾性能,哪种最合适。
或者,在当前背景下,是否有更好的方案。

1049 5 1
5个回答

fgt1t5y

没必要发三个一样的问题吧

  • zxyfaxcn 2023-11-25

    一个问题,三个目前想到的,不是很确定的方案,想咨询下可行性 和优选方案的。

zxyfaxcn

方案1 目前已经实现,压测来看,在一定并发下发布代码,没有出现502
但考虑到 alb 本身是负载产品,所以想省掉nginx(nginx也会消耗一定的系统资源), 但后面两种目前还没在生产上实践过,不确定会不会有问题

  • 暂无评论
army

我都是直接stop再start 断2秒而已,用户必须接受😬

  • zxyfaxcn 2023-11-25

    不能的,这个项目比较特殊,并发高,不能停服,不能有中途中断

walkor

三种方案都可以,方案三实际上和直接执行 php start.php reload 区别不大。
webman reload过程就是安全停止一个进程,然后补充一个新的进程,直到所有进程更新。
有alb,nginx可以不要,所以要性能好绝对安全的话第二种方案较好。

  • zxyfaxcn 2023-11-27

    明白了,感谢老板回复。

  • army 2023-11-27

    如果on...里面都是静态方法,reload是不是就不起作用了?

  • zxyfaxcn 2023-11-27

    是的,所以才想到基于系统内核的负载port reuse

  • walkor 2023-11-27

    webman里业务代码都支持reload,和静态方法无关

  • army 2023-11-27

    我是workerman, 静态方法确实不起作用,进程都有重启,但是在方法输出的变量还是之前的。

  • walkor 2023-11-27

    workerman启动脚本里写死的代码不支持reload,你可以把业务分出来在onWorkerStart时加载,这样就支持reload了
    参考文档 https://www.workerman.net/doc/workerman/faq/reload-principle.html

  • army 2023-11-27

    那可能就没辙了,我用的workerman/Autoloader 😄

  • walkor 2023-11-27

    一样

  • army 2023-12-11

    原来是opcache的原因,关掉就可以了,所以opcache有没有必要开启?

  • walkor 2023-12-11

    opcache对于视图模板有一定加速作用,其它没有作用,可以禁用

  • xiaopi 2024-01-22

    如果直接覆盖二进制文件,然后reload有影响么

  • 第六人 2024-01-23

    学习了

Tinywan

2 路过

🔝