• Czas czytania ~3 min
  • 15.06.2023

Redis, potężny magazyn struktury danych w pamięci, można bezproblemowo zintegrować z aplikacjami Laravel, aby zwiększyć ich wydajność i umożliwić wydajną synchronizację między wieloma aplikacjami.

W tym wpisie na blogu omówimy, jak skonfigurować dwie aplikacje Laravel, aby połączyć się z pojedynczą instancją Redis i używać jej do wysyłania i przetwarzania zadań synchronizacji. Zademonstrujemy również, jak ustawić niestandardowy prefiks klucza dla usługi Redis, aby zachować izolację danych między kolejką domyślną a kolejką synchronizacji. Zanurzmy się!

1. Konfigurowanie połączeń

Redis Otwórz config/database.php plik w obu aplikacjach Laravel i zlokalizuj macierz redis.

Dodaj nową konfigurację połączenia w tablicy "connections" dla wystąpienia Redis o nazwie "sync".

Upewnij się, że ustawiłeś prefiks niestandardowy w options kluczu połączenia. Laravel domyślnie generuje prefiks dla każdego zadania w kolejce.

Przez to ustawienie nadpiszemy je i sprawimy, że będzie takie samo w obu aplikacjach.

Oto przykład tego, jak powinna wyglądać konfiguracja:

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

Ensure that the SYNC_REDIS_HOST, , SYNC_REDIS_PORTSYNC_REDIS_PASSWORD values are set according to your Redis server configuration that will be shared between applications.

2. Tworzenie zadań

synchronizacji2.1 Pierwsza aplikacja Laravel (źródło)

W pierwszej aplikacji Laravel utwórz SynchronizeItem zadanie i użyj połączenia "synchronizuj".

Metoda handle nie jest konieczna, ponieważ pierwsza aplikacja Laravel nie będzie przetwarzać tego zadania, więc tylko właściwości zadania muszą być takie same jak zadanie zdefiniowane w drugiej aplikacji Laravel.

Oto przykład tego, jak powinno wyglądać zadanie:

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 Druga aplikacja Laravel (miejsce docelowe)

W drugiej aplikacji Laravel utwórz SynchronizeItem zadanie i użyj połączenia

"synchronizuj".Teraz zdefiniujemy handle metodę przechowywania danych lub przetwarzania ich w naszej docelowej aplikacji Laravel.

Upewnij się, że właściwości są dokładnie takie same jak w zadaniu zdefiniowanym w pierwszej aplikacji Laravel.

Oto przykład tego, jak powinno wyglądać zadanie:

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. Wysyłanie zadania synchronizacjiPo napisaniu klasy zadania można ją wysłać za pomocą metody wysyłania do rzeczywistego zadania

w pierwszej aplikacji Laravel.

Konstruktor zadania otrzyma następujące argumenty, które zostały przekazane do metody dispatch:

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

Zadanie zostanie wypchnięte do kolejki, która używa połączenia udostępnionego wystąpienia Redis.

Po wysłaniu SynchronizeItem zadania do kolejki musimy uruchomić proces roboczy kolejki w drugiej aplikacji Laravel w celu przetworzenia zadań synchronizacji.

Przed jej uruchomieniem musimy zdefiniować tę kolejkę w naszym config/queue.php pliku konfiguracyjnym.

Oto przykład tego, jak powinna wyglądać konfiguracja:

'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 zdefiniowaniu kolejki synchronizacji w drugiej aplikacji Laravel możemy rozpocząć proces pracy kolejki.

php artisan queue:work sync

To polecenie uruchamia proces roboczy kolejki, który nasłuchuje "domyślnej" kolejki przy połączeniu "synchronizuj" i przetwarza zadania wysłane do niego z pierwszej aplikacji Laravel.

Konkluzja

W tym wpisie w blogu omówiliśmy, jak skonfigurować dwie aplikacje Laravel, aby połączyć się z pojedynczym wystąpieniem Redis i używać go do wysyłania i przetwarzania zadań synchronizacji.

Wykonując czynności opisane powyżej, możesz zapewnić bezproblemową komunikację między aplikacjami Laravel i wykorzystać moc Redis w celu zwiększenia wydajności.

Ponadto nauczyliśmy się, jak używać połączenia kolejki niestandardowej i ustawić prefiks klucza niestandardowego dla usługi Redis, aby zachować izolację danych od innych zadań.

Mamy nadzieję, że ten przewodnik pomoże Ci w tworzeniu wydajnych i zsynchronizowanych aplikacji Laravel.

Odwołania:

Laravel Dokumentacja: Kolejki

Laravel Dokumentacja: Redis

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297