Как выполнить очередь и кеширование с помощью redis для многопользовательской архитектуры с несколькими базами данных в Laravel 5?

Я работаю над многопользовательской архитектурой с множеством баз данных, используя Laravel, что в основном означает, что каждый арендатор приложения имеет свою собственную базу данных, собственные наборы пользователей, ресурсы и т.д.

Теперь я пытаюсь реализовать очереди и кэширование в приложении, тогда я пытаюсь использовать redis для этого. Пример кода выглядит так:

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

Это отправить приветственное письмо пользователю. Но очередь представляет собой хранение всех очередей в одной и той же базе данных в том же экземпляре Redis, по-разному меня будут путать разные электронные письма арендатора.

Как подключиться к Laravel 5 и изменить поведение очереди, чтобы либо хранить задания для каждого арендатора в отдельной базе данных, либо хранить дополнительную метаинформацию о арендаторе, к которому принадлежит конкретная работа? И тогда также, как бы я сказал Laravel проанализировать эту дополнительную метаинформацию и подключиться к правильной базе данных арендаторов, прежде чем продолжить работу?

Ответ 1

Для надлежащей работы системы "Очередь" вам необходимо использовать собственную реализацию \Illuminate\Queue\SerializesModels. Wheech сохранит и запустит правильное соединение БД при Job::__sleep() и Job::__wakeup(). Взгляните на свойство TenantAwareJob пакета hyn/multi-tenant.

Для надлежащей работы системы Cache вам необходимо использовать префикс, который зависит от текущего хоста. Посмотрите, как разработчики hyn/multi-tenant рекомендуют реализовать это.

Ответ 2

Это не должно быть проблемой, поскольку очередь - это просто очередь. т.е. задачи в нем содержат реальные необходимые данные, если вы хотите "классифицировать" очереди для лучшего управления, вы можете метод onQueue указать очередь или onConnection чтобы указать соединение, к 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);