繁体   English   中英

在不同的应用程序上使用 laravel 队列/作业,需要建议

[英]Using laravel queues/jobs on different apps, need advice

我有不同的 Web 和后端批处理/作业存储库,上面有 Laravel 应用程序。 这是为了更轻松,更安全地发布。 我不希望某些后端批处理的更改影响 Web 部件上的任何内容。

我无法使用 laravel 队列和作业从 Web 部件分派作业,因为队列工作器将位于具有不同 laravel 应用程序的批处理服务器上。

处理这种设置的推荐方法是什么? 目前我正在考虑在后端结合 redis pub/sub和 laravel 队列。 所以我需要 2 个主管,一个用于订阅命令,一个用于队列工作者。 redis sbuscribe 存在一些问题,例如在新部署时重新启动主管,我可能会丢失一些已发布的消息。 不过,解决方法可能是使用 pm2 滚动重启。

但我想知道 laravel 是否有其他更好的方法或包来处理我的用例?

最后我发现我可以这样做:

网络回购 - 应用程序 1:

<?php

namespace App\Jobs;
...

class SomeJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $userId;
    private $someParam;

    public function __construct(int $userId, string $someParam)
    {
        $this->userId = $userId;
        $this->someParam = $someParam;
    }

    public function handle()
    {
        // for implementation check same file in batch repo
    }
}

批量回购 - 应用程序 2

<?php

namespace App\Jobs;
...

class SomeJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $userId;
    private $someParam;

    public function __construct(int $userId, string $someParam)
    {
        $this->userId = $userId;
        $this->someParam = $someParam;
    }

    public function handle()
    {
        // actual implementation
        echo $this->userId . " " . $this->someParam;
    }
}

然后我可以在网络应用程序中执行以下操作:

SomeJob::dispatch($userId, $someParam);

在批处理应用程序中有一个正在运行的队列工作器:

php artisan queue:work --sleep=3 --tries=1 --delay=1

并且工作得很好,在批处理服务器上处理。 我正在使用 redis 来存储排队的作业。

解释:

它的工作方式是,当我在 Web 应用程序上调度作业时,它会在 redis 中创建一个带有作业名称(类名和文件路径)的键,以及我传递的构造函数参数,所有这些都存储在 redis 中。

然后,当我运行队列工作器时,它会批量获取所有排队的键并搜索相同的文件和路径,因此它们必须相同。 然后它将启动批量存储库的实际实现。

这甚至适用于不同版本的 Laravel。 我的应用程序版本为 8,批处理版本为 5.7,并且工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM