Как реализовать очередь с пользовательской базой данных в многоменточной архитектуре?Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать очередь с пользовательской базой данных в многоменточной архитектуре?

Сообщение Anonymous »

Я работаю над множественным приложением в Laravel, где соединение базы данных определяется динамически на основе subdomain запроса. Например: < /p> Я реализовал промежуточное программное обеспечение (

Код: Выделить всё

IdentifyTenant
) Чтобы обнаружить поддомен, извлечь данные базы данных арендатора и динамически установите соединение:

Код: Выделить всё

config([
'database.connections.custom' => [
'driver'    => 'mysql',
'host'      => $tenantDetails['db_host'],
'database'  => $tenantDetails['db_name'],
'username'  => $tenantDetails['db_user'],
'password'  => $tenantDetails['db_password'],
'charset'   => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix'    => '',
'strict'    => false,
'engine'    => null,
],
]);
DB::setDefaultConnection('custom');
Это отлично работает для HTTP-запросов, а подключение к базе данных устанавливается динамически в зависимости от поддомена.
Проблема: работники очереди
Когда я запускаю очередь php artisan: работа или очередь php artisan: слушайте, работник очереди всегда выбирает базу данных по умолчанию из файла .env. Однако в моем случае мне нужно, чтобы исполнитель динамически определял соединение с базой данных на основе деталей клиента, хранящихся в задании.

< h3>Что я пробовал:

[*]Передача сведений об арендаторе в полезные данные задания: >
При отправке я включил в задание детали, специфичные для арендатора. это:

Код: Выделить всё

$tenantDetails = [
'db_host' => '127.0.0.1',
'db_name' => 'spain_db',
'db_user' => 'root',
'db_password' => '',
];
YourJob::dispatch($tenantDetails);
В методе дескриптора задания я динамически устанавливаю базу данных:

Код: Выделить всё

config([
'database.connections.custom' => [
'driver'    => 'mysql',
'host'      => $this->tenantDetails['db_host'],
'database'  => $this->tenantDetails['db_name'],
'username'  => $this->tenantDetails['db_user'],
'password'  => $this->tenantDetails['db_password'],
'charset'   => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix'    => '',
'strict'    => false,
'engine'    => null,
],
]);
DB::setDefaultConnection('custom');
Использование события JobProcessing:
Я создал прослушиватель JobProcessing< /code> событие для динамической настройки базы данных арендаторов:

Код: Выделить всё

namespace App\Listeners;

use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Support\Facades\DB;

class SetTenantForQueue
{
public function handle(JobProcessing $event)
{
$tenantDetails = $event->job->payload()['data']['tenantDetails'] ?? null;

if ($tenantDetails) {
config([
'database.connections.custom' => [
'driver'    => 'mysql',
'host'      => $tenantDetails['db_host'],
'database'  => $tenantDetails['db_name'],
'username'  => $tenantDetails['db_user'],
'password'  => $tenantDetails['db_password'],
'charset'   => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix'    => '',
'strict'    => false,
'engine'    => null,
],
]);
DB::setDefaultConnection('custom');
}
}
}
и зарегистрировал его в Eventserviceprovider :
use Illuminate\Queue\Events\JobProcessing;
use App\Listeners\SetTenantForQueue;

protected $listen = [
JobProcessing::class => [
SetTenantForQueue::class,
],
];
< /code>
< /li>
< /ol>

Проблема: < /strong> < /h3> < Br /> Несмотря на эти попытки, работник все еще, кажется, выбирает базу данных по умолчанию из файла .env < /code> при выполнении задания. Как я могу гарантировать, что работник очереди динамически использует базу данных арендаторов на основе субдомена или полезной нагрузки? < /strong> < /h3>

Как я могу настроить работник очереди Laravel для динамического установки подключения к базе данных для каждого задания? < /li>
Есть ли лучший способ обработать многопользовательские базы данных с очередями в Ларавеле? )? Заранее спасибо!


Подробнее здесь: https://stackoverflow.com/questions/793 ... chitecture
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»