Laravel Haystack 是一个允许你在数据库中存储作业链的包。
由于链中的所有作业都在数据库中,内存使用率很低,您可以长时间延迟作业或长时间运行作业,而不会冒险使用所有内存。
Laravel Haystack 开箱即用地支持每个队列连接/工作者。(数据库、Redis/Horizon、SQS)。
$haystack = Haystack::build() ->withName('Podcast Chain') ->addJob(new RecordPodcast) ->addJob(new ProcessPodcast) ->addJob(new PublishPodcast) ->then(function () { // Haystack完成 }) ->catch(function () { // Haystack失败 }) ->finally(function () { // 总是在成功或失败时运行. }) ->paused(function () { // 如果 haystack 暂停则运行 }) ->withMiddleware([ // 适用于每项工作的中间件 ]) ->withDelay(60) // 为每个作业添加延迟 ->dispatch();
但是Laravel不是已经有工作链了吗?
让我们明确一点,我们不是在谈论批处理作业。
Laravel 确实有工作链,但他们有一些考虑。
1.由于链存储在作业中,因此它们消耗了大量的内存/数据。如果您要存储数千个作业,则尤其如此。2.它们是易变的,这意味着如果你失去了链条中的一份工作——你就会失去整个链条。3.它们不提供批处理作业所提供的then, catch,finally可调用方法。4.基于内存或 SQS 队列的长时间延迟是不可能的,因为您可能会由于过期或服务器关闭而丢失作业。5.您无法在作业之间共享数据,因为整个链中没有“状态”
Laravel Haystack 旨在通过将作业链存储在数据库中并一次排队一个作业来解决这个问题。
当作业完成时,Laravel Haystack 会监听“作业完成”事件,并将链中的下一个作业从数据库中排队。
使用Laravel Haystack这个包,您可以将作业链存储在数据库中,这有助于降低内存消耗并支持所有 Laravel 开箱即用的队列类型。
其他一些主要功能包括:
1.低内存消耗,因为一次处理一个作业,链存储在数据库中2.您可以根据需要延迟/释放作业,因为它将使用调度程序重新启动链。即使您的队列驱动程序是 SQS!3.它提供回调方法,如then,catch和finally4.可应用于链中每个作业的全局中间件5.可以添加到链中每个作业的延迟6.您可以存储和检索链中每个作业都可以访问的数据/状态。7.您可以存储模型以供以后处理。8.你可以做一些很酷的事情,例如如果你的工作链调用 API 并达到速率限制,则暂停 haystacks。虽然 Laravel 有作业链,但我认为您应该考虑将这个包用于批处理作业。查看自述文件,了9.解此软件包与内置链功能的区别的完整详细信息。
Laravel Haystack场景用例
1.如果您需要连续进行数百或数千次API调用,可以结合Spatie的Job Rate Limiter来跟踪延迟并在达到速率限制时暂停作业。2.如果您需要一次将数千个作业排成队列。3.如果您需要批量导入数据行 - 每一行都可以是一个干草堆作业(大包)并且一次处理一个。同时将重要的工作信息保存在数据库中。4.如果您使用Amazon SQS时需要超过 15 分钟的“发布”时间
Laravel Haystack包支持的版本及安装配置
必需
Laravel 8+ 和 PHP 8.1
安装
您可以通过 composer 安装该软件包:
composer require sammyjo20/laravel-haystack
然后发布并运行迁移:
php artisan vendor:publish --tag="haystack-migrations"php artisan migrate
您可以使用以下命令发布配置文件:
php artisan vendor:publish --tag="haystack-config"
...等等...
了解更多有关此软件包的更多信息,获取完整的安装说明,
并在GitHub上查看源代码。
git:
https://github.com/Sammyjo20/laravel-haystack