Я работаю над многопользовательским приложением в Laravel, где подключение к базе данных определяется динамически на основе субдомена запроса. Например:
Это отлично работает для HTTP-запросов, а подключение к базе данных устанавливается динамически в зависимости от субдомена. Проблема: работники очереди
Когда я запускаю очередь php artisan: работа или очередь php artisan: слушайте, работник очереди всегда выбирает базу данных по умолчанию из файла .env. Однако в моем случае мне нужно, чтобы исполнитель динамически определял соединение с базой данных на основе деталей клиента, хранящихся в задании.
< h3>Что я пробовал:
Передача сведений об арендаторе в полезные данные задания: >
При отправке я включил в задание детали, специфичные для арендатора. это:
use Illuminate\Queue\Events\JobProcessing;
use App\Listeners\SetTenantForQueue;
protected $listen = [
JobProcessing::class => [
SetTenantForQueue::class,
],
];
Проблема:Несмотря на эти попытки, исполнитель по-прежнему выбирает базу данных по умолчанию из файла .env при выполнении задания. Как я могу гарантировать, что работник очереди динамически использует базу данных клиента на основе поддомена или полезных данных задания?
В чем мне нужна помощь:
[*]Как настроить обработчик очереди Laravel для динамической установки соединения с базой данных для каждого задания?
[*] Есть ли лучший способ обработки мультитенантных баз данных с очередями в Laravel?
[*]Как сделать обработчик очереди «с учетом арендатора», не требуя ручного вмешательства (например, запуска отдельных обработчиков для каждого арендатора)?
Я был бы очень признателен за любые советы и рекомендации по реализации этого сценария в многопользовательской архитектуре. Заранее спасибо!
Я работаю над [b]многопользовательским приложением[/b] в Laravel, где подключение к базе данных определяется динамически на основе [b]субдомена[/b] запроса. Например: [list] [*][code]spain.example.com[/code] использует Spain_db . [*][code]india.example.com[/code] использует india_db . [/list] Я реализовал промежуточное программное обеспечение ([code]IdentifyTenant[/code]) Чтобы обнаружить поддомен, извлечь данные базы данных арендатора и динамически установите соединение: [code]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-запросов[/b], а подключение к базе данных устанавливается динамически в зависимости от субдомена. [b]Проблема: работники очереди[/b] Когда я запускаю очередь php artisan: работа или очередь php artisan: слушайте, работник очереди [b]всегда выбирает базу данных по умолчанию из файла .env[/b]. Однако в моем случае мне нужно, чтобы исполнитель динамически определял соединение с базой данных на основе [b]деталей клиента[/b], хранящихся в задании.
< h3>[b]Что я пробовал:[/b] [list] [*][b]Передача сведений об арендаторе в полезные данные задания:[/b] > При отправке я включил в задание детали, специфичные для арендатора. это: [code]$tenantDetails = [ 'db_host' => '127.0.0.1', 'db_name' => 'spain_db', 'db_user' => 'root', 'db_password' => '', ]; YourJob::dispatch($tenantDetails); [/code] В методе задания я динамически устанавливаю базу данных: [code]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'); [/code]
[*] [b] Использование jobprocessing Событие: [/b] Я создал слушателя для процесса работы Событие для динамической настройки базы данных арендатора: < /p> [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;
[b]Проблема:[/b]Несмотря на эти попытки, исполнитель по-прежнему выбирает базу данных по умолчанию из файла .env при выполнении задания. Как я могу гарантировать, что работник очереди динамически использует базу данных клиента на основе поддомена или полезных данных задания?
[b]В чем мне нужна помощь: [/b]
[*]Как настроить обработчик очереди Laravel для динамической установки соединения с базой данных для каждого задания? [*] Есть ли лучший способ обработки мультитенантных баз данных с очередями в Laravel? [*]Как сделать обработчик очереди «с учетом арендатора», не требуя ручного вмешательства (например, запуска отдельных обработчиков для каждого арендатора)?
Я был бы очень признателен за любые советы и рекомендации по реализации этого сценария в многопользовательской архитектуре. Заранее спасибо!
Я следил за блогами, онлайн-статьями, видео для GCD и наткнулся на очередь целевых терминов (в некоторых блогах). Я думал, что понял GCD, но потом эта терминология целевой очереди меня очень смутила.
Я пытаюсь решить проблему, используя очередь приоритетов, где у меня есть двумерный массив times, где индексы во втором измерении представляют
начальный край, конечный край и расстояние между двумя краями
Также указывается край, с которого нужно...