阿里云kubernets使用记录11-代码更新导致消息队列的exit

上一期我们讲了怎么依次notReady,停止接流,然后依次reload的解决方案,可以有效的解决所有的pod同时reload导致的服务不可用。http://www.chenxianlei.com/archives/1772415922319

不过还存在一个问题,消息队列无法停止,也就说虽然我们让pod处于notReady的状态,svc不再分流过来,但是消息队列的进程还在持续的进行任务的消费,这就导致我们进行reload的时候,消费任务一直较多的情况,导致任务执行过程的中断。

我们这里的解决方案就是任务排空,就是当我们准备reload一个pod的时候,让本pod里的消费进程把手里的任务干完就行了,不允许再拿新的任务消费了。其他的pod还在正常的状态,其他的pod在消费就行了。

这里我们默认用的webman官方的webman/redis-queue,我们无法修改官方的消费的代码,可以重新增加一个消费类进行覆盖,这里我为了使用方便,也发布了一个composer包,使用起来就非常方便了

1、根据上一期的内容进行改造,做好基础的依次reload的功能

其中包括关闭自动reload,已经sh脚本对/dev/shm/reloading的写入,手动reload等操作

2、安装我们的composer包

composer require kylin987/webman-redis-queue-drain

这个是兼容webman1.x和2.x的

安装后,会自动生成对应的配置文件,在config/plugin/kylin987/redis-queue-drain/app.php

配置文件这里几乎不需要改动任何内容,除非你的/dev/shm/reloading 有变化,和之前的写成一致就行

3、替换消费类

打开config/plugin/webman/redis-queue/process.php,我们会看到现在的消费类handler的配置,默认是Webman\RedisQueue\Process\Consumer::class,我们改为Kylin987\WebmanRedisQueueDrain\Process\Consumer::class就可以了,当然了,要重启一次项目才生效

4、观察生效和注意事项

我们在server.php里有一个配置项stop_timeout,这个我们可以设置的长一点,例如10,它代表着当项目进行reload的时候,最多等10秒,等各进程把事情做完了再reload,一般来说,如果消费进行不进行新的任务的领取,10秒完全足够队列把手里的事情做完了。后续我们就可以看消费进程的exit_count数字有没有显著减少了

文章作者: Wind
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 雕刻时光
喜欢就支持一下吧