【发布时间】:2020-03-17 07:00:01
【问题描述】:
我有 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 数据库之类的?
我意识到发布一个我已经找到解决方案的问题可能看起来很奇怪,但我想在盲目询问之前尝试自己解决它,虽然我找到了解决方案,但确实让我很恼火可能是一个更简单的解决方案,我只是不知道。最坏的情况,如果没有更好的解决方案,其他有同样问题的人会找到这个并发现我的解决方案。
【问题讨论】:
-
我认为你最好的选择是在你的
config/database.php中指定 3 个不同的 redis 连接到 3 个不同的数据库,然后在你的config/queue.php中根据你的app.name选择一个(当指定哪个队列应该使用的redis连接)和你的config/horizon.php(当指定Horizon应该在哪里存储他自己的元信息时,'use'键)。
标签: laravel laravel-5 queue laravel-horizon