我有 3 个 Laravel 应用程序都在需要用于 Horizon 的同一台服务器上运行。
我遇到了一个问题,即无法运行冲突和作业的应用程序。
使用 Medis 检查 Redis 数据库后,我可以看到每个作业都有 3 个条目:
- PRODUCTION_horizon:2
- STAGING_horizon:2
- HRS_horizon:2
其中production
和是我的应用程序名称,并且staging
是作业的 ID。hrs
2
如果作业是从中分派的,staging
它可能仍被production
or拾取hrs
,然后只是等待暂存,从未实际运行。
经过大量搜索后,我找到了解决此问题的方法,方法是在我的所有队列前面加上应用程序名称。
所以我的配置从此改变:
'production' => [
'default' => [
'connection' => 'redis',
'queue' => ['default', 'emails', 'calculations'],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
'long_running' => [
'connection' => 'redis',
'queue' => ['bulk_calculations', 'imports', 'build_parents'],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
'staging' => [
'default' => [
'connection' => 'redis',
'queue' => ['default', 'emails', 'calculations'],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
'long_running' => [
'connection' => 'redis',
'queue' => ['bulk_calculations', 'imports', 'build_parents'],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
'hrs' => [
'default' => [
'connection' => 'redis',
'queue' => ['default', 'emails', 'calculations'],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
'long_running' => [
'connection' => 'redis',
'queue' => ['bulk_calculations', 'imports', 'build_parents'],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
对此:
'production' => [
env('APP_NAME') . '_default' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_default',
env('APP_NAME') . '_emails',
env('APP_NAME') . '_calculations'
],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
env('APP_NAME') . '_long_running' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_bulk_calculations',
env('APP_NAME') . '_imports',
env('APP_NAME') . '_build_parents'
],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
'staging' => [
env('APP_NAME') . '_default' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_default',
env('APP_NAME') . '_emails',
env('APP_NAME') . '_calculations'
],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
env('APP_NAME') . '_long_running' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_bulk_calculations',
env('APP_NAME') . '_imports',
env('APP_NAME') . '_build_parents'
],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
'hrs' => [
env('APP_NAME') . '_default' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_default',
env('APP_NAME') . '_emails',
env('APP_NAME') . '_calculations'
],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
env('APP_NAME') . '_long_running' => [
'connection' => 'redis',
'queue' => [
env('APP_NAME') . '_bulk_calculations',
env('APP_NAME') . '_imports',
env('APP_NAME') . '_build_parents'
],
'balance' => 'simple',
'processes' => 1,
'tries' => 3,
'timeout' => 86400 // 1 day
]
],
这实际上使它起作用了!所以基本上我已经修复了它。
但这感觉真的不对。
现在,当我将作业分派到特定队列时,我必须做MyJob::dispatch()->onQueue(config('app.name') . '_emails');
这显然是不理想的。
我觉得必须有更好的方法,但文档中没有解释如何做到这一点。
有没有办法阻止地平线相互干扰?也许我应该使用多个 Redis 数据库之类的?
我意识到发布一个我已经找到解决方案的问题可能看起来很奇怪,但我想在盲目询问之前尝试自己修复它,虽然我找到了解决方案,但我真的很恼火,可能有很多更简单的解决方案我只是不知道。最坏的情况,如果没有更好的解决方案,其他有同样问题的人会找到这个并发现我的解决方案。