Laravel Horizon:同一服务器上的多个实例相互干扰



我有3个Laravel应用程序都在同一台服务器上运行,需要用于Horizon。

我遇到了一个问题,冲突和作业所在的应用程序无法运行。

在使用Medis检查Redis数据库后,我可以看到每个作业有3个条目:

  • PRODUCTION_horizon:2
  • STAGING_horizon:2
  • HRS_horizon:2

其中productionstaginghrs是我的应用程序名称,2是作业的ID。

如果作业是从staging调度的,那么它可能仍然会被productionhrs拾取,然后只是挂起进行暂存,而从未实际运行。

经过多次搜索,我发现了一个解决方案,在我的所有队列中都加上了应用程序名称。

所以我的配置改变了:

'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.phpredis部分添加额外的条目来使用更多的数据库。

但我不确定你会把什么放在地平线上使用这些。

一个小提示,如果你正在使用https://github.com/luin/medis那么您将无法立即查看其他数据库,您必须前往终端并使用select 3查看第三个数据库。

相关内容

  • 没有找到相关文章

最新更新