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_PORT
SYNC_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