超时作业挂起 15 或 30 分钟,然后运行
Timed out job hangs for 15 or 30 minutes and then runs
- Horizon 版本:3.7.2 / 3.4.7
- Laravel版本:6.17.0
- PHP版本:7.4.4
- Redis驱动&版本:predis 1.1.1 / phpredis 5.2.1
- 数据库驱动程序和版本:-
我们的 Horizon 出现了奇怪的错误。基本上这是发生了什么:
- 作业已排队。并开始处理。
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,
],
],
]
这是它在 Horizon 仪表板
中的样子
当初始作业超时时。在重试工作时,它在 Recent Jobs
中保持这样。
将近半小时后变成这样:
都是一样的标签,我只是把名字涂黑了。
这是我们看到的日志(这里的时间是 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 有 none。
我们尝试了很多不同的组合,来消除这个问题。它发生在每一个组合中。所以我们认为它一定是带有 Horizon.
的东西
我们试过:
- Predis Redis 5 和 Redis 3
具有不同 read_write_timeout
值的 Predis
PHPRedis 与 Redis 5 和 Redis 3
在一台服务器上启用了 THP。因此,我们还尝试了所有与禁用 THP 的服务器的组合。
我们在 Laravel 6.11 和 Horizon 3.4.7 然后升级到 Laravel 6.14 和 Horizon 3.7.2
只有一个 Horizon 运行 实例。此 Horizon 实例中没有处理其他队列。
欢迎提供任何信息或提示来尝试!
对我们来说,这是我们系统中的配置错误。我们使用的是 OpenShift 和 Docker。我们在 containers/systems
中调整了这些值
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
现在一切正常。
- Horizon 版本:3.7.2 / 3.4.7
- Laravel版本:6.17.0
- PHP版本:7.4.4
- Redis驱动&版本:predis 1.1.1 / phpredis 5.2.1
- 数据库驱动程序和版本:-
我们的 Horizon 出现了奇怪的错误。基本上这是发生了什么: - 作业已排队。并开始处理。
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,
],
],
]
这是它在 Horizon 仪表板
中的样子当初始作业超时时。在重试工作时,它在 Recent Jobs
中保持这样。
将近半小时后变成这样:
都是一样的标签,我只是把名字涂黑了。
这是我们看到的日志(这里的时间是 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 有 none。
我们尝试了很多不同的组合,来消除这个问题。它发生在每一个组合中。所以我们认为它一定是带有 Horizon.
的东西我们试过: - Predis Redis 5 和 Redis 3
具有不同
read_write_timeout
值的 PredisPHPRedis 与 Redis 5 和 Redis 3
在一台服务器上启用了 THP。因此,我们还尝试了所有与禁用 THP 的服务器的组合。
我们在 Laravel 6.11 和 Horizon 3.4.7 然后升级到 Laravel 6.14 和 Horizon 3.7.2
只有一个 Horizon 运行 实例。此 Horizon 实例中没有处理其他队列。
欢迎提供任何信息或提示来尝试!
对我们来说,这是我们系统中的配置错误。我们使用的是 OpenShift 和 Docker。我们在 containers/systems
中调整了这些值net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
现在一切正常。