1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
// config/queue.php: 队列驱动类型
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'queue', // 配置连接哪个 redis 数据库,用于 job 的存储
'queue' => 'default', // 默认队列名称
'retry_after' => 300, // 任务过期:这个选项指定了队列连接在重试一个任务前应该等它执行多久
'block_for' => 3, // 阻塞:将失败任务重新放入 Redis 数据库以及处理器轮询之前阻塞多久
],
]
// config/database.php
'redis' => [
'default' => [
'host' => env('REDIS_HOST', 'redis'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'horizon-task' => [
'host' => env('REDIS_HOST', 'redis'),
'password' => env('REDIS_PASSWORD_QUEUE', null),
'port' => env('REDIS_PORT_QUEUE', 6379),
'database' => 1,
],
]
// config/horizon.php: Queue Worker Configuration
'use' => 'horizon-task', // 配置 horizon 监控台相关信息存储的 redis 库,请看上面 database.php 的 redis 配置
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'test'], // 队列名称配置
'balance' => 'simple', // 负载均衡策略:false/simple/auto
'processes' => 20, // 进程数
'tries' => 2, // 任务失败重启次数
'timeout' => 120, // 队列超时时间
'sleep' => 3 // 队列进程睡眠时间:当任务在队列中可用时,处理器将会一直无间隔地处理任务。 然而, sleep 选项定义了如果没有新任务的时候处理器将会「睡眠」多长时间。在处理器睡眠时,它不会处理任何新任务 —— 任务将会在队列处理器再次启动后执行。
],
// 配置多个"supervisors",便于资源分配
'supervisor-2' => [
'connection' => 'redis',
'queue' => ['task'],
'balance' => 'simple',
'processes' => 30,
'tries' => 3,
'timeout' => 600,
'sleep' => 3
],
],
]
// Horizon包括一个Metrics仪表板,它提供关于您的作业和队列等待时间以及吞吐量的信息。为了填充此仪表板,应配置Horizon的快照Artisan命令,使其每五分钟通过应用程序的计划程序运行一次
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('horizon:snapshot')->everyFiveMinutes();
}
// 默认情况下,你只能在 local 环境下访问这个后台。如果想要为后台定义更多的特定访问策略,需要使用 Horizon:auth 方法。auth 方法接收一个返回 true 或 false 的回调,从而决定用户是否可以访问 Horizon 后台。通常,我们会在 AppServiceProvider 的 boot 方法中调用 Horizon:auth:
Horizon::auth(function ($request) {
// return true / false;
});
|