NovinkaProflow — AI správa nehnuteľností je spustená
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky články

LaravelAktualizované

Synchronizácia Laravel aplikácií cez Redis

Synchronizácia Laravel aplikácií cez Redis — Roundly Consulting

Keď si dve Laravel aplikácie potrebujú vymieňať dáta, prvý reflex býva postaviť medzi nimi HTTP API. Existuje však ľahšia cesta: nasmerovať obe aplikácie na jednu zdieľanú Redis inštanciu a nechať správy prenášať queue systém Laravelu. Jedna strana job odošle, druhá ho spracuje — retry, backoff a monitoring dostanete s queue workerom zadarmo.

V tomto návode nakonfigurujeme samostatné Redis pripojenie v oboch aplikáciách, definujeme zhodnú job triedu na každej strane a spustíme worker, ktorý synchronizačné joby spracúva. Vlastný prefix kľúčov drží zdieľanú frontu oddelenú od predvolených front oboch aplikácií.

1. Konfigurácia Redis pripojenia

V oboch aplikáciách otvorte config/database.php a do poľa redis pridajte pripojenie s názvom sync. Dôležitá je voľba prefix: Laravel predvolene prefixuje Redis kľúče podľa aplikácie, takže dve aplikácie by aj na rovnakom serveri čítali a zapisovali rôzne kľúče. Rovnaký explicitný prefix na oboch stranách zabezpečí, že vidia tú istú frontu.

'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_')
        ],
    ],
],

Hodnoty SYNC_REDIS_HOST, SYNC_REDIS_PORT a SYNC_REDIS_PASSWORD nasmerujte na Redis server, ktorý obe aplikácie zdieľajú.

2. Synchronizačný job

Zdrojová aplikácia

Zdrojová aplikácia joby iba odosiela — nikdy ich nespúšťa. Jej job trieda preto potrebuje správny názov, rovnaké verejné properties ako trieda v cieľovej aplikácii a pripojenie sync. Metóda handle ostáva prázdna:

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

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

    public function handle(): void
    {
        // Iba definícia — spracovanie prebieha v cieľovej aplikácii.
    }
}

Cieľová aplikácia

Cieľová aplikácia definuje tú istú triedu — rovnaký názov, rovnaký konštruktor — a v metóde handle payload skutočne spracuje:

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

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

    public function handle(): void
    {
        // Payload smerujeme podľa typu — napr. vyvoláme doménový event.
        match($this->data['type']) {
            SynchronizationType::Transaction->value => $this->processTransaction(),
        };
    }

    protected function processTransaction(): void
    {
        TransactionSynchronized::dispatch($this->data);
    }
}

Názvy tried a tvar properties sa musia zhodovať presne — queue serializuje job podľa názvu triedy, takže nesúlad sa prejaví ako failed job na cieľovej strane.

3. Odoslanie jobu

Zo zdrojovej aplikácie job odošlete ako každý iný Laravel job. Namiesto lokálnej fronty skončí na zdieľanej Redis fronte:

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

4. Queue worker

Na cieľovej strane zaregistrujte queue pripojenie sync v config/queue.php, aby ho worker mohol počúvať:

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

    'sync' => [
        'driver' => 'redis',
        'connection' => 'sync', // Pripojenie definované v database.php
        'queue' => env('SYNC_REDIS_QUEUE', 'default'),
        'retry_after' => 90,
        'block_for' => null,
        'after_commit' => false,
    ],
]

Potom spustite worker (v produkcii pod Supervisorom alebo systemd):

php artisan queue:work sync

Worker počúva frontu default na pripojení sync a spracuje každý job, ktorý zdrojová aplikácia odošle.

Záver

Dve Laravel aplikácie si teraz vymieňajú dáta cez jednu Redis inštanciu len pomocou queue primitív, ktoré Laravel už obsahuje: zdieľané pripojenie, zhodná job trieda na oboch stranách a worker. Vlastný prefix kľúčov drží synchronizačnú frontu oddelenú od vlastných jobov aplikácií a spracovanie zlyhaných jobov, retry aj monitoring fungujú ako pri bežných frontách.

Návrh spoľahlivých integrácií medzi systémami — fronty, API, webhooky, synchronizácie — je každodennou súčasťou našich API a integračných služieb. Ak si vaše aplikácie stále vymieňajú dáta cez CSV exporty, napíšte nám.

Chcete, aby to fungovalo aj u vás?

Napíšte nám, čo chcete zautomatizovať alebo postaviť — do 48 hodín odpovieme s konkrétnym návrhom.