3
  • 地平线版本:3.7.2 / 3.4.7
  • Laravel 版本:6.17.0
  • PHP版本:7.4.4
  • Redis 驱动和版本:predis 1.1.1 / phpredis 5.2.1
  • 数据库驱动程序和版本:-

我们的 Horizo​​n 出现了奇怪的错误。基本上这就是发生的事情: - 一个作业排队。并开始处理。

  • 90 秒后(我们的超时配置值)它超时。

  • 120 秒(我们的retry_after值)后重试作业。

  • 重试作业成功。

  • 15 分钟或 30 分钟后,原始作业(超时)完成。随着运行实际工作。

似乎这可能发生在任何类型的工作中。例如,如果它是排队的可邮寄邮件,则用户首先收到一封电子邮件,然后在 15 或 30 分钟后用户收到另一封电子邮件。一样的。

这是我们的配置文件

config/database.php

'redis' => [
        'client' => env('REDIS_CLIENT', 'predis'),
        'default' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    ],

config/queue.php

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => env('DEFAULT_QUEUE_NAME', 'default'),
    'retry_after' => 120, // 2 minutes
    'block_for' => null,
],

config/horizon.php

'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => env('HORIZON_CONNECTION', 'redis'),
            'queue' => [env('DEFAULT_QUEUE_NAME', 'default')],
            'balance' => 'simple',
            'processes' => 10,
            'tries' => 3,
            'timeout' => 90,
        ],
    ],
]

这是它在 Horizo​​n 仪表板中的外观

当初始作业超时时。Recent Jobs在重试工作时, 它会保持这种状态。地平线1

差不多半个小时后变成这样:

地平线2

标签是一样的,我只是把名字涂黑了。

这是我们看到的日志(这里的时间是 UTC)

[2020-04-22 11:24:59][88] Processing: App\Mail\ReservationInformation

[2020-04-22 11:29:00][88] Failed: App\Mail\ReservationInformation

[2020-04-22 11:29:00][88] Processing: App\Mail\ReservationInformation

[2020-04-22 11:56:21][88] Processed: App\Mail\ReservationInformation

注意:使用 Predis 我们还可以看到一些类似的日志,Error while reading line from the server. [tcp://REDIS_HOST:6379]但使用 PHPRedis 则没有。

我们尝试了很多不同的组合,以消除问题。它发生在每一个组合中。所以我们认为这一定与 Horizo​​n 有关系。

我们尝试了: - Predis 与 Redis 5 和 Redis 3

  • read_write_timeout具有不同值的 Predis

  • PHPRedis 与 Redis 5 和 Redis 3

  • THP 在一台服务器上启用。因此,我们还尝试了与禁用 THP 的服务器的所有组合。

  • 我们在 Laravel 6.11 和 Horizo​​n 3.4.7 然后升级到 Laravel 6.14 和 Horizo​​n 3.7.2

只有一个 Horizo​​n 实例正在运行。此 Horizo​​n 实例中不处理任何其他队列。

欢迎任何信息或提示尝试!

4

1 回答 1

0

对我们来说,这被证明是我们系统中的配置错误。我们使用的是 OpenShift 和 Docker。我们在容器/系统中调整了这些值

net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time

现在一切正常。

于 2022-01-18T10:45:22.620 回答