我有3个Laravel应用程序都在同一台服务器上运行,需要用于Horizon。
我遇到了一个问题,冲突和作业所在的应用程序无法运行。
在使用Medis检查Redis数据库后,我可以看到每个作业有3个条目:
- PRODUCTION_horizon:2
- STAGING_horizon:2
- HRS_horizon:2
其中production
、staging
和hrs
是我的应用程序名称,2
是作业的ID。
如果作业是从staging
调度的,那么它可能仍然会被production
或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数据库或其他什么?
我意识到,发布一个我已经找到解决方案的问题可能看起来很奇怪,但我想在盲目提问之前自己尝试解决它。尽管我已经找到了解决方案,但可能还有一个我不知道的更简单的解决方案,这真的让我很恼火。最坏的情况是,如果没有更好的解决方案,其他有同样问题的人会发现这个问题并找到我的解决方案。
最好的解决方案实际上是在.env文件中使用REDIS DB的值
REDIS_DB=2 (default is 0)
REDIS_CACHE_DB=3 (default is 1)
Redis默认有16个数据库,所以假设你在同一台服务器上最多有8个站点,那应该没问题。
我认为您可以通过在database.php
的redis
部分添加额外的条目来使用更多的数据库。
但我不确定你会把什么放在地平线上使用这些。
一个小提示,如果你正在使用https://github.com/luin/medis那么您将无法立即查看其他数据库,您必须前往终端并使用select 3
查看第三个数据库。