本文以 Laravel 10 为基线,使用官方队列组件与 Redis 驱动,结合 Horizon 与 Supervisor 提供生产级并发处理与可观测性。所有配置与命令在 Linux/Windows 下均可验证(Windows 用 PowerShell 启动进程)。
## 环境前提
- Laravel 10.x,`php >= 8.1`。
- Redis 6/7(作为队列后端)。
- Horizon >= 5.x(与 Laravel 10 兼容)。
## 队列驱动与基础配置
1. `.env` 中设置驱动:
QUEUE_CONNECTION=redis
REDIS_CLIENT=phpredis
2. `config/queue.php` 验证 `redis` 连接存在且默认队列名设置合理(默认 `default`)。
3. 创建示例 Job:
// app/Jobs/ProcessReport.php
class ProcessReport implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3; // 失败重试次数
public $backoff = [5, 30, 120]; // 递增退避(秒)
public function handle() {
// 业务处理逻辑
}
public function retryUntil() {
return now()->addMinutes(10); // 失败窗口
}
}
4. 投递任务:
ProcessReport::dispatch($payload)->onQueue('reports');
## Horizon 并发与队列分池
1. 安装并发布配置:
composer require laravel/horizon
php artisan horizon:install
2. 配置队列与进程池(`config/horizon.php`):
'environments' => [
'production' => [
'supervisor-reports' => [
'connection' => 'redis',
'queue' => ['reports'],
'balance' => 'auto', // 自动均衡工作进程
'minProcesses' => 2,
'maxProcesses' => 16,
'maxTime' => 300,
'maxJobs' => 1000,
'retry' => 10,
],
'supervisor-default' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'minProcesses' => 1,
'maxProcesses' => 8,
],
],
],
3. 启动 Horizon(开发/验证):
php artisan horizon
4. 观测:访问 `/horizon`,查看吞吐、失败、处理时长与重试。
## Supervisor 守护与自启
在 Linux 使用 `supervisor` 守护 Horizon;Windows 可使用 NSSM 或任务计划。
Linux 示例:
[program:horizon]
command=php artisan horizon
directory=/var/www/html
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/horizon.log
验证:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status horizon
## 失败重试与速率限制(可验证)
- Job 内置 `$tries` 与 `backoff`,在 Horizon UI 可见失败与重试轨迹。
- 全局速率限制(如外部 API):
RateLimiter::for('external-api', function () {
return Limit::perMinute(60)->by('external-api');
});
// 在 Job 中使用
if (RateLimiter::tooManyAttempts('external-api', 60)) {
return $this->release(10);
}
## 队列隔离与优先级
- 通过不同队列名与不同 Supervisor 进程池实现资源隔离。
- 高优队列设置更高 `minProcesses/maxProcesses`,并限制 `maxTime` 与 `maxJobs` 防止“慢任务拖垮”。
## 可观测性与报警
- Horizon 指标:吞吐、失败率、处理耗时(P95/P99)。
- Redis 队列深度:`LLEN queues:reports`(Phpredis 客户端或 Redis CLI)。
- 应用层日志:将 Job 的关键步骤打点到统一日志(如 Monolog)。
## 注意事项
- 确保 Redis 与 PHP 扩展(`phpredis`/`predis`)版本兼容 Laravel 10。
- 在 Windows 生产环境建议改用 Linux 容器运行 Horizon 与 Supervisor,获得更稳定的守护能力。
- Horizon 的 `balance=auto` 在负载波动场景更稳定,简单场景可使用 `simple`。
## 结语
通过 Redis 队列 + Horizon + Supervisor 的组合,可以在 Laravel 10 上构建可靠的并发任务处理体系。上文的配置与命令均可直接复现,确保从开发到生产的行为一致。

发表评论 取消回复