Hyperf异步队列需确保任务不堆积、失败可追溯、消费不丢数据;配置三步:安装依赖、生成非空配置文件、确认Redis连接池已正确定义;投递任务推荐继承Job类并设置$maxAttempts与retry_seconds;启用消费进程需注册ConsumerProcess、启动服务并验证日志及Redis队列出入状态。

高并发场景下,Hyperf 异步队列必须做到任务不堆积、失败可追溯、消费不丢数据——否则订单超时取消失效、消息推送延迟、批量同步卡死都会直接暴露在线上。
初始化异步队列组件
第一步:安装依赖,执行命令:composer require hyperf/async-queue。这一步不能跳过,否则后续所有配置都无效。
第二步:生成配置文件,运行 php bin/hyperf.php vendor:publish hyperf/async-queue。如果 config/autoload/async_queue.php 已存在,该命令不会覆盖,【务必确认文件已生成且内容非空】。
第三步:检查 Redis 连接池是否启用。async_queue.php 中 'redis' => ['pool' => 'default'] 对应的 pool 名必须已在 config/autoload/pool.php 中正确定义,否则消费进程启动后会静默失败,无任何报错日志。
投递一个带重试的异步任务
方法一:继承 Job 类(推荐用于需精细控制重试逻辑的场景)
在 app/Job/OrderTimeoutCheckJob.php 中定义:
namespace App\Job;use Hyperf\AsyncQueue\Job;class OrderTimeoutCheckJob extends Job { public int $orderId; protected int $maxAttempts = 3; public function __construct(int $orderId) { $this->orderId = $orderId; } public function handle() { // 此处调用 OrderService::cancelIfTimeout($this->orderId) }}
控制器中投递:$this->container->get(JobDispatcher::class)->dispatch(new OrderTimeoutCheckJob(123456));
注意:$maxAttempts 设为 3 表示最多尝试 4 次(首次 + 3 次重试),retry_seconds 默认为 5 秒,即失败后第 5 秒重试,不是立即重试。
启用并验证消费进程
第一步:将消费进程类加入 config/autoload/processes.php:
return [ Hyperf\AsyncQueue\Process\ConsumerProcess::class,];
第二步:确保项目已启用协程模式,执行 php bin/hyperf.php start 启动服务。此时 ConsumerProcess 会自动拉起,无需额外启动命令。
第三步:观察日志输出,运行 tail -f runtime/logs/hyperf.log,若看到类似 [INFO] Async queue consumer started, channel: queue 的日志,说明消费进程已就绪。
第四步:手动触发一次任务投递,然后执行 redis-cli lrange queue 0 -1,确认任务已入队;再等待 2–3 秒后再次执行该命令,若列表变为空,说明任务已被消费,流程闭环完成。


















