mehr-it / lara-worker-heartbeat
为 Laravel 工作进程添加心跳和观察者,允许检测挂起或卡住的工作进程
Requires
- php: >=7.1.0
- laravel/framework: ^6.0|^7.0|^8.0
Requires (Dev)
- ext-pcntl: *
- ext-posix: *
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^7.4|^8.5
This package is auto-updated.
Last update: 2024-08-30 00:58:28 UTC
README
此包实现了一个队列工作进程心跳,另一个进程会观察这个心跳以检测卡住或挂起的工作进程。
为什么心跳是必要的?
Laravel 内置了对工作进程超时的处理,使用 SIGALRM 信号让工作进程在达到指定超时后自行终止。然而,这无法处理整个进程卡住、信号不再被处理或工作进程在信号处理程序注册之前卡住的情况。
即使 supervisord 在这种情况下也无法提供帮助,因为工作进程可能仍在运行,但不再做任何事情。
它如何工作?
此包通过扩展 queue:work
命令来添加观察器进程的能力,该进程监控实现的工作进程心跳。Laravel 的队列工作进程被扩展以向观察器进程发送定期的心跳信号和状态信息。当观察器进程在预期的时间内没有收到心跳信号时,它将终止工作进程。
安装
composer require mehr-it/lara-worker-heartbeat
此包使用 Laravel 的包自动发现,因此服务提供程序将被自动加载。
确保已加载 PHP 扩展 posix
和 pcntl
。否则,队列工作进程无法创建所需的观察器进程,并将抛出错误。
使用方法
使用此包时,您不需要修改应用程序代码。您只需将 --heartbeat-timeout
选项传递给队列工作命令
artisan queue:work default --heartbeat-timeout=5
这将在每 5 秒内期望收到一个心跳信号的观察者线程中启动。当然,当工作进程正在睡眠或处理持续时间超过 5 秒的任务时,不会期望收到心跳。
根据预期的工人周期持续时间(不包含睡眠时间)选择心跳超时。通常,这比查询队列以获取新任务的时间略长。所以大多数情况下,5 秒是一个安全值。但在弹出操作需要更长时间的情况下(例如,使用 AWS SQS 和长轮询),您必须增加超时。
实现细节
在每个工作循环的迭代中都发送心跳信号,该循环正在寻找队列中的新作业。
当工作进程即将睡眠或开始处理作业时,它会在一段时间内不发送任何心跳信号。工作进程将通知观察者它将无法发送任何心跳的期间,观察者将尊重这一点。
如果既没有为工作进程设置超时,也没有为当前处理的作业设置超时,观察器进程确实期望在任何心跳信号之前完成作业。在这种情况下,观察者无法检测到挂起或卡住的过程,因为它不知道何时期望下一个心跳信号。
当观察到的工人进程不再运行时,观察器进程将自动停止。