0

Horizo​​n を使用する必要がある 3 つの Laravel アプリがすべて同じサーバー上で実行されています。

クラッシュとジョブが実行されないアプリで問題が発生しました。

Medis を使用して Redis データベースを調べたところ、ジョブごとに 3 つのエントリがあることがわかりました。

  • PRODUCTION_horizo​​n:2
  • STAGING_horizo​​n:2
  • HRS_horizo​​n:2

ここproductionで、staginghrsはアプリケーション名で、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データベースか何かを使うべきですか?

すでに解決策を見つけたものの質問を投稿するのは奇妙に思えるかもしれませんが、やみくもに質問する前に自分で試して修正したいと思いました。私が知らないだけの簡単な解決策。最悪の場合、より良い解決策がない場合、同じ問題を抱えている他の誰かがこれを見つけて私の解決策を発見するでしょう。

4

1 に答える 1

0

最善の解決策は、実際には .env ファイルで REDIS DB の値を使用することです

REDIS_DB=2 (default is 0)
REDIS_CACHE_DB=3 (default is 1)

Redis にはデフォルトで 16 のデータベースがあるため、同じサーバー上に最大 8 つのサイトがあると仮定しても問題ありません。

redisのセクションにエントリを追加することで、さらに多くのデータベースを使用できると思いますdatabase.php

しかし、これらを使用するために Horizo​​n に何を入れるかはわかりません。

https://github.com/luin/medisを使用している場合、端末に移動して 3 番目のデータベースを表示するために使用する必要がある他のデータベースをすぐに見ることができない場合の小さなヒントが 1 つありselect 3ます。

于 2020-03-18T23:22:56.923 に答える