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

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

Сообщение Anonymous »

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

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

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 Событие:
    Я создал слушателя для процесса работы Событие для динамической настройки базы данных арендатора: < /p>

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

    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,
    ],
    ];
    
Проблема:Несмотря на эти попытки, исполнитель по-прежнему выбирает базу данных по умолчанию из файла .env при выполнении задания. Как я могу гарантировать, что работник очереди динамически использует базу данных клиента на основе поддомена или полезных данных задания?

В чем мне нужна помощь:

[*]Как настроить обработчик очереди Laravel для динамической установки соединения с базой данных для каждого задания?
[*] Есть ли лучший способ обработки мультитенантных баз данных с очередями в Laravel?
[*]Как сделать обработчик очереди «с учетом арендатора», не требуя ручного вмешательства (например, запуска отдельных обработчиков для каждого арендатора)?

Я был бы очень признателен за любые советы и рекомендации по реализации этого сценария в многопользовательской архитектуре. Заранее спасибо!

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

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

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

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

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

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

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