Wie implementieren Sie die Warteschlange mit benutzerdefinierter Datenbank in Multitenant -Architektur?Php

PHP-Programmierer chatten hier
Guest
 Wie implementieren Sie die Warteschlange mit benutzerdefinierter Datenbank in Multitenant -Architektur?

Post by Guest »

Ich arbeite an einer multitenant -Anwendung in Laravel, in der die Datenbankverbindung dynamisch auf der basierenden subdomain der Anforderung ermittelt wird. Zum Beispiel: < /p>
  • Code: Select all

    spain.example.com
    verwendet die spain_db.
  • Code: Select all

    india.example.com
    verwendet die india_db.
Ich habe Middleware implementiert (

Code: Select all

IdentifyTenant
) Um die Subdomäne zu erkennen, die Datenbankdetails des Mieters abzurufen und die Verbindung dynamisch wie folgt festlegen:

Code: Select all

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');
Dies funktioniert perfekt für HTTP-Anfragen und die Datenbankverbindung wird dynamisch basierend auf der Subdomain festgelegt.
Das Problem: Warteschlangenarbeiter
Wenn ich php artisan queue:work oder php artisan queue:listen wählt der Warteschlangenarbeiter immer die Standarddatenbank aus .env-Datei. In meinem Fall muss der Worker jedoch die Datenbankverbindung basierend auf den im Job gespeicherten Mandantendetails dynamisch bestimmen.

< h3>Was ich versucht habe:

[*]Übergabe von Mandantendetails in der Job-Nutzlast:
Ich habe beim Versenden des Auftrags mieterspezifische Details in den Auftrag aufgenommen:

Code: Select all

$tenantDetails = [
'db_host' => '127.0.0.1',
'db_name' => 'spain_db',
'db_user' => 'root',
'db_password' => '',
];
YourJob::dispatch($tenantDetails);
In der Handelshandelsmethode des Jobs habe ich die Datenbank dynamisch festgelegt:

Code: Select all

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');
Verwenden des Jobprozessing Ereignis: [/b]
Ich habe einen Hörer für die Jobprozessierung erstellt < /Code> Ereignis zur dynamischen Konfiguration der Mieterdatenbank: < /p>

Code: Select all

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');
}
}
}
Und in EventServiceProvider registriert:
use Illuminate\Queue\Events\JobProcessing;
use App\Listeners\SetTenantForQueue;

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

Das Problem: < /strong> < /h3> < BR /> Trotz dieser Versuche scheint der Mitarbeiter die Standarddatenbank aus der Datei .env < /code> bei der Ausführung des Jobs auszuwählen. Wie kann ich sicherstellen, dass der Warteschlangenarbeiter die Mieterdatenbank dynamisch basierend auf der Subdomain oder der Jobnutzlast verwendet? < /strong> < /h3>

Wie kann ich den Warteschlangenarbeiter von Laravel so konfigurieren, dass die Datenbankverbindung für jeden Job dynamisch festgelegt wird? < /li>
Gibt es eine bessere Möglichkeit, Multitenant-Datenbanken mit Warteschlangen in Laravel zu verarbeiten? )? < /li>
< /ol>
Ich würde mich wirklich an Ratschläge oder Best Practices für die Behandlung dieses Szenarios in einer vielfältigen Architektur freuen. Danke im Voraus!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post