使用不同的 redis 连接处理 Laravel 中的作业
Using a different redis connection to process jobs in Laravel
我有一个系统,每小时都会启动大量作业,我希望它们在不同的 redis 连接上处理,与主要的作业分开,以便它们弹出不要干扰其他被推入队列的作业(即延迟它们)。
所以我做了以下操作,我创建了一个新的 redis 连接:
'kingdom_jobs' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 2),
],
然后创建了一个新的队列连接:
'kingdom_jobs' => [
'driver' => 'redis',
'connection' => 'kingdom_jobs', // Uses the new connection
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
然后在启动所有这些作业的循环中:
Kingdom::chunkById(250, function($kingdoms) use ($service) {
foreach ($kingdoms as $kingdom) {
UpdateKingdomJob::dispatch($kingdom)->onConnection('kingdom_jobs');
}
});
问题?
是的,他们被推送到这个新连接,我在 horizon 中看到他们 - 超过 500 个 - 但他们什么都不做。他们没有得到处理。有没有办法告诉 horizon 处理这个额外的连接?
我目前在开发中使用 php artisan horizon
来处理作业 - 还有其他步骤吗?
我从文档中假设,我缺少一些步骤,我假设它与文档中的 php artisan queue:work --tries = 3
有关?尝试这样做没有任何效果。我是否需要另一个 horizon 实例用于此新连接,或者我是否配置 horizon 以了解此连接?
求助?
您可能没有设置 Horizon 主管来监视您的新队列。
查看 Horizon 配置:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],
看来我们可以在生产环境中添加另一个主管(如果需要,还可以添加其他主管):
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
'supervisor-2' => [
'connection' => 'kingdom_jobs',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],
我有一个系统,每小时都会启动大量作业,我希望它们在不同的 redis 连接上处理,与主要的作业分开,以便它们弹出不要干扰其他被推入队列的作业(即延迟它们)。
所以我做了以下操作,我创建了一个新的 redis 连接:
'kingdom_jobs' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 2),
],
然后创建了一个新的队列连接:
'kingdom_jobs' => [
'driver' => 'redis',
'connection' => 'kingdom_jobs', // Uses the new connection
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
然后在启动所有这些作业的循环中:
Kingdom::chunkById(250, function($kingdoms) use ($service) {
foreach ($kingdoms as $kingdom) {
UpdateKingdomJob::dispatch($kingdom)->onConnection('kingdom_jobs');
}
});
问题?
是的,他们被推送到这个新连接,我在 horizon 中看到他们 - 超过 500 个 - 但他们什么都不做。他们没有得到处理。有没有办法告诉 horizon 处理这个额外的连接?
我目前在开发中使用 php artisan horizon
来处理作业 - 还有其他步骤吗?
我从文档中假设,我缺少一些步骤,我假设它与文档中的 php artisan queue:work --tries = 3
有关?尝试这样做没有任何效果。我是否需要另一个 horizon 实例用于此新连接,或者我是否配置 horizon 以了解此连接?
求助?
您可能没有设置 Horizon 主管来监视您的新队列。
查看 Horizon 配置:
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],
看来我们可以在生产环境中添加另一个主管(如果需要,还可以添加其他主管):
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
'supervisor-2' => [
'connection' => 'kingdom_jobs',
'queue' => ['default'],
'balance' => 'auto',
'minProcesses' => 1,
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'tries' => 3,
],
],
],