ScalavaDych vyrážajúce škálovanie pre Laravel aplikácie.

Préjsť na Scalava

Synchronizácia Laravel Aplikácií s Redis-om

Laravel

Redis, výkonné úložisko dátových štruktúr v pamäti, možno bez problémov integrovať do Laravel aplikácií s cieľom zvýšiť ich výkon a umožniť efektívnu synchronizáciu medzi viacerými Laravel aplikáciami.

V tomto blogovom príspevku sa budeme venovať tomu, ako nakonfigurovať dve aplikácie v Laraveli tak, aby sa pripojili k jednej inštancii Redis a využívali ju na odosielanie a spracovanie synchronizačných úloh. Ukážeme si tiež, ako nastaviť vlastný prefix kľúčov pre Redis, aby sa zachovala izolácia údajov medzi defaultnou queue a synchronizačnou queue. Poďme sa na to pozrieť!

1. Konfigurácia pripojenia Redis

Otvorte súbor config/database.php v oboch aplikáciách v Laraveli a nájdite pole redis.

Pridajte novú konfiguráciu pripojenia v poli 'connections' pre inštanciu Redis s názvom 'sync'.

Uistite sa, že ste v kľúči options pripojenia nastavili vlastný prefix. Laravel predvolene generuje prefix pre každý job pushnutý do queue.

Týmto nastavením ho prepíšeme a urobíme ho rovnakým v oboch aplikáciách.

Tu je príklad, ako by mala vyzerať konfigurácia:

'connections' => [
    // Other connections...

    'sync' => [
        'url' => env('SYNC_REDIS_URL'),
        'host' => env('SYNC_REDIS_HOST', '127.0.0.1'),
        'port' => env('SYNC_REDIS_PORT', '6379'),
        'password' => env('SYNC_REDIS_PASSWORD', null),
        'database' => env('SYNC_REDIS_DB', '1'),
        'options' => [
            'prefix' => env('SYNC_REDIS_PREFIX', 'app_sync_')
        ],
    ],
],

Uistite sa, že hodnoty SYNC_REDIS_HOST, SYNC_REDIS_PORT, SYNC_REDIS_PASSWORD sú nastavené podľa konfigurácie servera Redis, ktorý bude zdieľaný medzi aplikáciami.

2. Vytvorenie synchronizačného jobu

2.1 Prvá Laravel Aplikácia (Zdroj dát)

V prvej aplikácii vytvorte job SynchronizeItem a použite pripojenie "sync".

Metóda handle nie je potrebná, pretože prvá aplikácia nebude túto úlohu spracovávať, takže sa vyžaduje, aby boli iba properties jobu rovnaké ako v druhej aplikácii.

Tu je príklad, ako by mal job vyzerať:

class SynchronizeItem implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(public array $data)
    {
        $this->onConnection('sync');
    }

    public function handle(): void
    {
        // This job is just definition, processing is made using Job class in destination Laravel Application.
    }
}

2.2 Druhá Laravel Aplikácia (Cieľ)

V druhej aplikácii vytvorte job SynchronizeItem a použite pripojenie "sync".

Teraz budeme definovať metódu handle na ukladanie údajov alebo ich spracovanie v našej cieľovej aplikácii.

Uistite sa, že properties jobu sú presne rovnaké ako v jobe v prvej aplikácii.

Tu je príklad, ako by mal job vyzerať:

class SynchronizeItem implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(public array $data)
    {
        $this->onConnection('sync');
    }

    public function handle(): void
    {
        // Processing of data. For example check the type of synchronization item and dispatch event.
        
        match($this->data['type']) {
            SynchronizationType::Transaction->value => $this->processTransaction(),
        }
    }
    
    protected function processTransaction(): void
    {
        TransactionSynchronized::dispatch($this->data);
    }
}

3. Spúštanie synchronizácie / jobu

Po napísaní jobov ho môžete odoslať pomocou metódy dispatch na jobe v prvej aplikácii.

Konštruktor jobu dostane argumenty, ktoré boli odovzdané metóde dispatch:

// Somewhere in your code

SynchronizeItem::dispatch([
    'type' => 'Transaction',
    'item' => [
        'currency' => 'EUR',
        'amountInCents' => 150_000,
    ],
]);

Synchronizačný job sa pushne do queue, ktorá používa zdielanú inštanciu Redis-u.

4. Queue Worker pre zdielanú inštanciu Redis-u

Po dispatch-y jobu SynchronizeItem do queue musíme v druhej aplikácii spustiť queue worker na spracovanie synchronizačných jobov.

Pred spustením workera ho musíme definovať v našom konfiguračnom súbore config/queue.php.

Tu je príklad, ako by mala vyzerať konfigurácia:

'connections' => [
    // Other connections...

    'sync' => [
        'driver' => 'redis',
        'connection' => 'sync', // Connection defined in database.php configuration
        'queue' => env('SYNC_REDIS_QUEUE', 'default'), // You can define custom queue in job or while dispatching, for now we keep it as "default"
        'retry_after' => 90,
        'block_for' => null,
        'after_commit' => false,
    ],
]

Po definovaní synchronizačnej queue v druhej aplikácii môžeme spustiť proces queue workera.

php artisan queue:work sync

Tento príkaz spustí queue worker, ktorý počúva "default" queue na spojení "sync" a spracováva joby odoslané do nej z prvej aplikácie.

Záver

V tomto príspevku sme sa venovali tomu, ako nakonfigurovať dve aplikácie Laravel tak, aby sa pripojili k jednej inštancii Redis a používali ju na odosielanie a spracovanie synchronizačných úloh.

Dodržiavaním uvedených krokov môžete zabezpečiť bezproblémovú komunikáciu medzi aplikáciami Laravel a využiť silu Redis-u na zvýšenie výkonu a rýchlosti synchronizácii medzi aplikáciami.

Okrem toho sme sa naučili používať vlastné pripojenie ku queue a nastaviť vlastný prefix kľúčov pre Redis, aby sa zachovala izolácia od ostatných queue.

Dúfame, že vám tento príspevok pomôže pri vytváraní efektívnych a synchronizovaných aplikácií v Laraveli.

Odkazy:

Laravel Dokumentácia: Queues

Laravel Dokumentácia: Redis

Začnite realizovať svoj nápad ešte dnes.

Ste pripravení začať realizovať svoj podnikateľský nápad? Kontaktujte nás a my sa postaráme o všetko ostatné.