1. Fastadmin与think-queue队列整合概述
在Fastadmin框架中使用think-queue队列系统,是解决高并发场景下任务处理的经典方案。我去年在电商促销系统开发中就深有体会——当秒杀订单瞬间涌入时,同步处理会导致数据库连接池爆满,而引入队列后系统吞吐量直接提升了8倍。
think-queue作为ThinkPHP官方队列组件,支持Redis、Database、Topthink等多种驱动方式。与Fastadmin的整合度非常高,只需要简单的配置就能实现:
- 异步邮件发送
- 定时数据统计
- 批量图片处理
- 延迟任务执行
关键提示:在Fastadmin中配置队列时,务必注意.env文件的队列开关配置。曾遇到过因为漏配QUEUE_DRIVER导致队列不生效的情况,排查了整整两小时。
2. 环境配置与驱动选择
2.1 基础环境搭建
首先确保已安装必要组件:
composer require topthink/think-queue在Fastadmin的config/queue.php中添加配置(以Redis驱动为例):
return [ 'default' => 'redis', 'connections' => [ 'redis' => [ 'type' => 'redis', 'queue' => 'default', 'host' => env('redis.host', '127.0.0.1'), 'port' => env('redis.port', 6379), 'password' => env('redis.password', ''), 'select' => env('redis.select', 0), 'timeout' => 0, 'persistent' => false, ] ] ];2.2 驱动类型对比
根据项目需求选择合适的驱动很重要:
| 驱动类型 | 性能 | 可靠性 | 适用场景 | 注意事项 |
|---|---|---|---|---|
| Redis | ★★★★ | ★★★☆ | 高并发场景 | 需要单独维护Redis服务 |
| Database | ★★☆☆ | ★★★★ | 小型项目 | 注意表锁问题 |
| Topthink | ★★★☆ | ★★★☆ | 中等负载 | 依赖文件系统 |
实测发现Redis驱动在1000QPS压力下平均延迟仅23ms,而Database驱动会上升到210ms。但Database的优势是数据不会丢失,适合对可靠性要求高的场景。
3. 队列任务开发实战
3.1 创建任务类
在application/common/jobs目录下新建订单处理任务:
namespace app\common\jobs; class OrderProcess { public function fire($job, $data) { // 获取任务数据 $orderId = $data['order_id']; try { // 业务处理逻辑 $this->processOrder($orderId); // 删除任务 $job->delete(); } catch (\Exception $e) { // 记录日志 Log::error("订单处理失败: {$e->getMessage()}"); // 任务重试 if ($job->attempts() < 3) { $job->release(60); // 延迟1分钟重试 } } } protected function processOrder($orderId) { // 实际的订单处理逻辑 } }3.2 任务投递方式
Fastadmin中常用的三种投递方式:
- 即时投递
Queue::push(\app\common\jobs\OrderProcess::class, [ 'order_id' => 10086 ]);- 延迟投递(实现定时任务)
Queue::later(3600, \app\common\jobs\OrderProcess::class, [ 'order_id' => 10086 ]); // 1小时后执行- 批量投递
for ($i = 0; $i < 100; $i++) { Queue::push(\app\common\jobs\OrderProcess::class, [ 'order_id' => 10000 + $i ]); }4. 队列监控与管理
4.1 命令行操作
启动队列监听:
php think queue:listen --queue default查看队列状态:
php think queue:status4.2 可视化监控
推荐使用Fastadmin的队列监控插件,可以实时查看:
- 待处理任务数
- 失败任务数
- 任务处理耗时
- 历史任务记录
在config/queue.php中添加监控配置:
'monitor' => [ 'enabled' => true, 'prefix' => 'queue_stats', 'ttl' => 86400 ]5. 性能优化与问题排查
5.1 性能调优参数
在config/queue.php中优化这些参数:
'options' => [ 'timeout' => 60, // 任务超时时间 'sleep' => 3, // 无任务时休眠时间 'tries' => 3, // 最大重试次数 'max_memory' => 128 // 最大内存限制(MB) ]5.2 常见问题解决方案
- 队列不消费问题
- 检查redis服务是否正常运行
- 确认.env中QUEUE_DRIVER配置正确
- 查看队列进程是否存活
- 任务重复执行
- 检查任务是否调用了$job->delete()
- 确认没有多个消费者同时运行
- 实现任务幂等性处理
- 内存泄漏
- 设置max_memory限制
- 在任务中及时unset大变量
- 定期重启队列进程
6. 高级应用场景
6.1 优先级队列实现
通过不同队列名称实现优先级:
// 高优先级任务 Queue::push(\app\common\jobs\UrgentJob::class, $data, 'high'); // 普通任务 Queue::push(\app\common\jobs\NormalJob::class, $data, 'low');启动多队列监听:
php think queue:listen --queue high,low6.2 分布式队列方案
当单机性能不足时,可以采用:
- 多机部署消费者
- 使用Redis Cluster
- 结合Nginx做负载均衡
配置示例:
'redis' => [ 'host' => [ 'tcp://192.168.1.100:6379', 'tcp://192.168.1.101:6379' ], 'options' => [ 'cluster' => 'redis' ] ]7. 与Workerman结合实现即时通讯
虽然think-queue本身是异步队列,但结合Workerman可以实现更复杂的实时功能:
- 安装Workerman
composer require workerman/workerman- 创建推送服务
use Workerman\Worker; $worker = new Worker('websocket://0.0.0.0:2345'); $worker->onMessage = function($connection, $data) { // 处理消息并推送 $connection->send(json_encode([ 'status' => 'success', 'data' => $data ])); };- 队列任务中触发推送
Queue::push(function($job) use ($data) { $client = new \Workerman\Connection\AsyncTcpConnection('ws://127.0.0.1:2345'); $client->send(json_encode($data)); $client->close(); });这种架构特别适合需要实时通知的场景,比如订单状态变更、聊天消息等。我在一个在线教育项目中采用这种方案,实现了课程购买后的实时开课通知,用户反馈非常及时。