无需自定义驱动,90%场景只需修改config/autoload/async_queue.php配置或扩展RedisDriver;仅当对接私有协议、嵌入式队列或直连TCP时才需实现CustomTcpDriver,须严格遵循接口规范与协程安全要求。

确认是否真需自定义驱动
Hyperf 3.0 的 hyperf/async-queue 默认已支持 Redis、AMQP(RabbitMQ)、NSQ 等主流驱动,若业务只需切换中间件或调整重试策略、超时逻辑,应优先修改 config/autoload/async_queue.php 中的 retry_seconds、handle_timeout 或自定义 RedisDriver 子类——**直接写新驱动是最后选项,90% 的场景不需要**。
只有当你要对接私有协议网关、嵌入式设备队列、或必须绕过 Redis 协议栈走直连 TCP 时,才进入自定义驱动开发流程。
实现自定义驱动类
在 app/Driver 目录下新建 CustomTcpDriver.php:
① 继承 Hyperf\AsyncQueue\Driver\DriverInterface,不可继承 AbstractDriver —— 它强制依赖 Redis 连接池,会埋下运行时 panic 隐患;
② 实现 push() 方法:接收 Job 对象,序列化后通过 Swoole\Coroutine\Socket 发送到目标 IP:PORT,返回布尔值;
③ 实现 pop() 方法:该方法在消费进程内被高频调用,**必须使用非阻塞 recv() 并设置超时为 100ms,否则会卡死整个协程调度器**;
④ delete() 和 fail() 可直接返回 true,因 TCP 驱动无服务端 ACK 机制,失败由上层重试保障。
注册驱动并配置连接池
方法一:在 config/autoload/async_queue.php 中声明驱动类路径:
'driver' => App\Driver\CustomTcpDriver::class,
方法二:通过 ConfigProvider 注入依赖(推荐)——在 app/Provider/QueueDriverProvider.php 中绑定:
$container->set(CustomTcpDriver::class, function ($container) { return new CustomTcpDriver($container->get(CustomTcpConnection::class)); });
【注意】 自定义连接池类 CustomTcpConnection 必须实现 Hyperf\Contract\ConnectionInterface,且 connect() 方法中要捕获 Swoole\Coroutine\Socket 的 ERRNO 错误码,不能抛出异常。
启用消费进程并验证启动
第一步:将自定义驱动类名写入 config/autoload/processes.php:
App\Process\CustomTcpConsumer::class,
第二步:编写消费者类,继承 Hyperf\Process\AbstractProcess,在 handle() 中循环调用 $this->container->get(CustomTcpDriver::class)->pop();
第三步:执行 php bin/hyperf.php start,观察控制台是否输出 Process[CustomTcpConsumer] start —— 若无此日志,说明 processes.php 未加载成功或类路径拼写错误;
第四步:向队列投递一条测试任务,用 tcpdump -i lo port 8080 抓包确认原始字节是否发出。



















