环境:阿里云 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停止旧服务。
请问,上面三种是否都可行,要确保服务高可用且兼顾性能,哪种最合适。
或者,在当前背景下,是否有更好的方案。
没必要发三个一样的问题吧
一个问题,三个目前想到的,不是很确定的方案,想咨询下可行性 和优选方案的。
方案1 目前已经实现,压测来看,在一定并发下发布代码,没有出现502
但考虑到 alb 本身是负载产品,所以想省掉nginx(nginx也会消耗一定的系统资源), 但后面两种目前还没在生产上实践过,不确定会不会有问题
我都是直接stop再start 断2秒而已,用户必须接受😬
不能的,这个项目比较特殊,并发高,不能停服,不能有中途中断
三种方案都可以,方案三实际上和直接执行 php start.php reload 区别不大。
webman reload过程就是安全停止一个进程,然后补充一个新的进程,直到所有进程更新。
有alb,nginx可以不要,所以要性能好绝对安全的话第二种方案较好。
明白了,感谢老板回复。
如果on...里面都是静态方法,reload是不是就不起作用了?
是的,所以才想到基于系统内核的负载port reuse
webman里业务代码都支持reload,和静态方法无关
我是workerman, 静态方法确实不起作用,进程都有重启,但是在方法输出的变量还是之前的。
workerman启动脚本里写死的代码不支持reload,你可以把业务分出来在onWorkerStart时加载,这样就支持reload了
参考文档 https://www.workerman.net/doc/workerman/faq/reload-principle.html
那可能就没辙了,我用的workerman/Autoloader 😄
一样
原来是opcache的原因,关掉就可以了,所以opcache有没有必要开启?
opcache对于视图模板有一定加速作用,其它没有作用,可以禁用
如果直接覆盖二进制文件,然后reload有影响么
学习了
2 路过
是的呢