Как реализовать очередь с помощью пользовательской базы данных в мультитенантной архитектуре?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');
< /code>
Это отлично работает для [b] http -запросов < /strong>, а подключение к базе данных динамически устанавливается на основе субдомена. < /p>
 < br/>   Проблема: queue raffsies [/b] 
Когда я запускаю очередь PHP Artisan: work 
или php Artisan queue: Слушайте , работник очереди всегда выбирает базу данных по умолчанию из файла .env . Однако, в моем случае, мне нужен работник, чтобы динамически определить соединение базы данных на основе данных арендатора < /strong> в задании. < /P>

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


[*] Пропустить подробности арендатора в работой полевой нагрузке:
Я включил подробную информацию в задании, специфичную для арендатора при его отправке: < /p>

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

$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:[/b]
Я создал прослушиватель 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»