Как выполнить очередь и кеширование с помощью 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);