Horizon を使用する必要がある 3 つの Laravel アプリがすべて同じサーバー上で実行されています。
クラッシュとジョブが実行されないアプリで問題が発生しました。
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データベースか何かを使うべきですか?
すでに解決策を見つけたものの質問を投稿するのは奇妙に思えるかもしれませんが、やみくもに質問する前に自分で試して修正したいと思いました。私が知らないだけの簡単な解決策。最悪の場合、より良い解決策がない場合、同じ問題を抱えている他の誰かがこれを見つけて私の解決策を発見するでしょう。