我正在使用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在继续工作之前解析额外的元信息并连接到正确的租户数据库?
答案 0 :(得分:1)
对于Queue系统的适当工作,您需要在Jobs中使用自己的\Illuminate\Queue\SerializesModels
特征实现。 Wheech将在Job::__sleep()
和Job::__wakeup()
上保存并初始化正确的数据库连接。
请查看TenantAwareJob trait个hyn/multi-tenant包。
对于Cache系统的适当工作,您需要使用取决于当前主机的前缀。看看hyn/multi-tenant开发人员如何推荐实现此功能。
答案 1 :(得分:0)
这通常不是问题,因为队列只是一个队列。即,其中的任务包含真正需要的数据,如果您想要对队列进行“分类”以便更好地进行管理,您可以onQueue
方法指定队列,或onConnection
到specify the connection you want to dispatch to。
e.g。
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);