如何在Laravel 5中使用redis为多租户多数据库架构应用程序执行排队和缓存



我正在使用Laravel开发一个多租户多数据库架构的应用程序,这基本上意味着应用程序中的每个租户都有自己的数据库、自己的用户集、资源等等

现在我正在尝试在应用程序中实现队列和缓存,然后我尝试使用redis。示例代码如下所示:

$mailer->send('emails.welcome', ['user' => $user], function ($message) use ($user) {
    $message->from("admin@admin.com", "Admin");
    $message->to($user->email, $user->first_name)->subject("Welcome!");
});

这是为了向注册用户发送一封欢迎电子邮件。但排队是将所有队列存储在同一个Redis实例的同一个数据库中,据我所知,不同租户的电子邮件会混淆。

如何连接到Laravel 5并更改队列行为,以便将每个租户的作业存储在单独的数据库中,或者存储有关特定作业所属租户的额外元信息?然后,我该如何告诉Laravel在继续工作之前解析额外的元信息并连接到正确的租户数据库?

对于队列系统的适当工作,您需要在作业中使用自己的IlluminateQueueSerializesModels特性实现。Wheech将在Job::__sleep()Job::__wakeup()上保存并初始化正确的DB连接。看看hyn/多租户包的TenantwareJob特性。

对于缓存系统的适当工作,需要使用取决于当前主机的前缀。看看hyn/多租户开发人员建议如何实现这一点。

这通常不会成为问题,因为队列只是一个队列。即其中的任务包含真正需要的数据,如果您想对队列进行"分类"以进行更好的管理,您可以使用onQueue方法指定队列,或者使用onConnection方法指定要调度到的连接。

例如

EmailJob::dispatch($podcast)
    ->onConnection('sqs')
    ->onQueue('tenant1');

您还可以为特定连接创建一个队列,如下所示,并将作业推送给它:

$tenant1Connection = Queue::connection('connection_name');
$tenant1Connection->pushOn('queue_name', $job)

如果你需要避开门面,你可以做:

app('queue')->connection('connection_name')->pushOn('queue_name', $job);

最新更新