kylin987/webman-redis-queue-drain

Drain Redis Queue consumers before reloading Webman workers.

Maintainers

Package info

github.com/kylin987/webman-redis-queue-drain

pkg:composer/kylin987/webman-redis-queue-drain

Transparency log

Statistics

Installs: 24

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.3 2026-08-04 09:33 UTC

This package is auto-updated.

Last update: 2026-08-04 09:34:55 UTC


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>