[英]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.