0

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

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

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

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

其中production和是我的应用程序名称,并且staging是作业的 ID。hrs2

如果作业是从中分派的,staging它可能仍被productionor拾取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 数据库之类的?

我意识到发布一个我已经找到解决方案的问题可能看起来很奇怪,但我想在盲目询问之前尝试自己修复它,虽然我找到了解决方案,但我真的很恼火,可能有很多更简单的解决方案我只是不知道。最坏的情况,如果没有更好的解决方案,其他有同样问题的人会找到这个并发现我的解决方案。

4

1 回答 1

0

最好的解决方案实际上是在 .env 文件中使用 REDIS DB 的值

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

Redis 默认有 16 个数据库,所以假设你在同一台服务器上最多有 8 个站点应该没问题。

我认为您可以通过redisdatabase.php.

但我不确定你会在 Horizo​​n 中放什么来使用这些。

如果您使用的是https://github.com/luin/medis,那么您将无法立即看到其他数据库,您必须前往终端并使用它select 3来查看第三个数据库。

于 2020-03-18T23:22:56.923 回答