sammyjo20/laravel-haystack

Laravel 的超级工作链

v2.2.0 2024-05-14 17:52 UTC

README

注意:2024年5月14日

我将不再接受 Laravel Haystack 的新功能。我打算继续确保安全修复,但我认为项目现在已经完成。此外,我认为 Laravel 10+ 的工作批量和链更加强大,你可能在 2024 年不需要 Laravel Haystack。

Laravel Haystack

⚡️ Laravel 的超级工作链

Build Status

点击此处阅读文档

Laravel Haystack 为 Laravel 提供了超级工作链。它具有强大的功能,例如延迟作业、为每个作业应用中间件、在作业之间共享数据和模型,甚至分批处理作业。Laravel Haystack 支持所有默认的队列连接/工作者。(数据库、Redis/Horizon、SQS)。如果你需要排队数千个作业,或者正在寻找原始 Bus 链不支持的功能,这将非常棒。

$haystack = Haystack::build()
   ->addJob(new RecordPodcast)
   ->addJob(new ProcessPodcast)
   ->addJob(new PublishPodcast)
   ->then(function () {
      // Haystack completed
   })
   ->catch(function () {
      // Haystack failed
   })
   ->finally(function () {
      // Always run either on success or fail.
   })
   ->withMiddleware([
      // Middleware for every job
   ])
   ->withDelay(60)
   ->withModel($user)
   ->dispatch();

Laravel 已经有了工作链吗?

是的,Laravel 确实有工作链,但它们有一些缺点你可能需要考虑。

  • 它们消耗相当多的内存/数据,因为链存储在作业中。如果你存储了数千个作业,这尤其如此。
  • 它们是易变的,这意味着如果你在链中丢失一个作业,你将丢失整个链。
  • 它们不提供批处理作业的 thencatchfinally 可调用方法。
  • 基于内存或 SQS 队列的长时间延迟是不可行的,因为你可能会因过期或服务器关闭而丢失作业。
  • 你无法在作业之间共享数据,因为没有“状态”贯穿整个链。

Laravel Haystack 通过将工作链存储在数据库中并一次排队一个作业来解决此问题。当作业完成时,Laravel Haystack 监听“作业完成”事件,并从数据库中排队链中的下一个作业。

Laravel Haystack 功能

  • 低内存消耗,因为一次只处理一个作业,链存储在数据库中
  • 你可以延迟/释放作业,直到你想的时间,因为它将使用调度器来重新启动链。即使你的队列驱动程序是 SQS!
  • 它提供了类似于 thencatchfinally 的回调方法。
  • 全局中间件,可以应用于链中的每个作业
  • 你可以存储与链中每个作业共享的模型和数据。
  • 你可以准备一个 Haystack 并在稍后调度它

用例

  • 如果你需要连续进行数百或数千次 API 调用,可以与 Spatie 的 Job Rate Limiter 结合使用,以跟踪延迟并在达到速率限制时暂停作业。
  • 如果你需要一次在链中排队数千个作业。
  • 如果你需要批量导入数据行 - 每行都可以是一个 Haystack 作业(包),一次处理一行。同时将重要的作业信息存储在数据库中。
  • 如果你使用 Amazon SQS,需要比 15 分钟更长的“释放”时间

安装

您可以使用 Composer 安装此包。**Laravel Haystack 需要 Laravel 8+ 和 PHP 8.1**

composer require sammyjo20/laravel-haystack

接下来,只需运行安装命令!

php artisan haystack:install

文档

点击此处阅读文档

支持 Haystack 的开发

虽然我从不期望得到任何东西,但如果你想支持我的工作,你可以通过在我的 Ko-Fi 页面上买一杯咖啡来捐赠!

Buy Me a Coffee at ko-fi.com

感谢您使用Laravel Haystack ❤️