kylin987 / webman-redis-queue-drain
Drain Redis Queue consumers before reloading Webman workers.
Package info
github.com/kylin987/webman-redis-queue-drain
pkg:composer/kylin987/webman-redis-queue-drain
Requires
- php: >=7.2
- webman/redis-queue: ^1.2 || ^2.1
- workerman/redis-queue: >=1.1 <1.3
README
在 Webman reload 前暂停 webman/redis-queue 领取新任务,同时允许已经领取的任务继续
执行。暂停状态只读取 Pod 本地文件,不使用 Redis 状态键或计数器。
支持:
- PHP 7.2 及以上
- Webman 1.x +
workerman/redis-queue 1.1 - Webman 2.x +
workerman/redis-queue 1.2
安装
composer require kylin987/webman-redis-queue-drain
将项目 Redis Queue 进程配置中的 handler 改为:
'handler' => \Kylin987\WebmanRedisQueueDrain\Process\Consumer::class,
包不会覆盖项目原有的队列进程数量和消费者目录配置。
配置
// config/plugin/kylin987/redis-queue-drain/app.php return [ 'enable' => true, 'reload_file' => getenv('WEBMAN_RELOADING_FILE') ?: '/dev/shm/reloading', 'poll_interval' => 0.2, ];
健康检查与部署脚本必须使用相同的 reload_file。可以通过以下命令读取项目实际生效的
路径:
vendor/bin/redis-queue-drain-config reload-file
文件存在时,队列 Worker 不再发起新的 BRPOP;文件删除后恢复消费。标志出现前已经
发出的 BRPOP 最多可能返回一条任务,该任务会正常执行一次。
部署约定
部署脚本应在 reload 前创建 reload_file,等待当前任务排空一段时间后执行普通
php start.php reload,并在 reload 后继续保留该文件一段时间。删除文件后,新队列
Worker 才会恢复领取任务。
Workerman 会逐个 reload Worker,固定等待不能严格证明所有旧 Worker 都已经退出。若 业务要求严格的完成确认,应在部署系统中增加 Workerman master 完成握手;本包本身只 负责暂停与恢复队列拉取。
Kubernetes 参考脚本
包内提供了一个保持简单职责的参考脚本:
bash vendor/kylin987/webman-redis-queue-drain/examples/deploy.sh <deployment-name>
脚本会按照 Pod 顺序执行:创建 reload_file、等待 readinessProbe 摘除 Pod、执行
Webman 自带的 php start.php reload、删除 reload_file。插件不负责发起 reload。
使用前请确认:
- Pod 使用
app=<deployment-name>标签; - readinessProbe 检查同一个
reload_file; SLEEP_BEFORE_RELOAD大于 readinessProbe 判定失败所需时间;- 容器工作目录中存在
start.php。
脚本默认使用 /dev/shm/reloading。若项目修改了插件的 reload_file,执行脚本时应设置
相同的环境变量:
WEBMAN_RELOADING_FILE=/path/to/reloading \
bash vendor/kylin987/webman-redis-queue-drain/examples/deploy.sh <deployment-name>