• Час читання ~3 хв
  • 15.06.2023

Redis, потужне сховище структури даних в пам'яті, може бути легко інтегровано з додатками Laravel, щоб підвищити їх продуктивність і забезпечити ефективну синхронізацію між декількома додатками.

У цьому блозі ми вивчимо, як налаштувати дві програми Laravel для підключення до одного екземпляра Redis та використовувати його для диспетчеризації та обробки завдань синхронізації. Ми також продемонструємо, як встановити спеціальний префікс ключів для Redis, щоб підтримувати ізоляцію даних між чергою за замовчуванням та чергою синхронізації. Давайте зануримося!

1. Налаштування з'єднань RedisВідкрийте config/database.php файл в обох додатках

Laravel і знайдіть масив redis.

Додайте нову конфігурацію з'єднання в масиві 'connections' для екземпляра Redis з назвою "sync".

Переконайтеся, що ви встановили власний префікс у options ключі з'єднання. Laravel генерує префікс для кожного завдання в черзі за замовчуванням.

За цим налаштуванням ми замінимо його та зробимо однаковим для обох програм.

Ось приклад того, як повинна виглядати конфігурація:

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

Переконайтеся, що значення , , встановлені відповідно до конфігурації вашого сервера Redis, SYNC_REDIS_PASSWORD SYNC_REDIS_HOSTSYNC_REDIS_PORTяка буде спільно використовуватися між програмами.

2. Створення завдань

синхронізації2.1 Перша програма Laravel (джерело)

У першому додатку Laravel створіть SynchronizeItem завдання та використовуйте з'єднання "синхронізації".

Метод handle не є необхідним, оскільки перша програма Laravel не буде обробляти цю роботу, тому лише властивості завдання повинні бути такими ж, як завдання, визначене у другій програмі Laravel.

Ось приклад того, як має виглядати завдання:

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 Друга програма Laravel (пункт призначення)

У другому додатку Laravel створіть SynchronizeItem завдання та скористайтеся з'єднанням "синхронізації".

Тепер ми визначимо handle метод зберігання даних або їх обробки в нашому додатку Laravel.

Переконайтеся, що властивості точно такі ж, як у завданні, визначеному в першому додатку Laravel.

Ось приклад того, як має виглядати завдання:

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. Диспетчеризація завдання синхронізаціїПісля того, як ваш клас роботи написаний, ви можете відправити його, використовуючи метод диспетчеризації фактичного завдання

в першій програмі Laravel.

Конструктор завдання отримає наступні аргументи, які були передані методу відправки:

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

Завдання буде виштовхнуто в чергу, яка використовує підключення спільного екземпляра Redis.

Після того, як ви відправили свою SynchronizeItem роботу в чергу, нам потрібно запустити працівника черги на другому додатку Laravel для обробки завдань синхронізації.

Перед його запуском нам потрібно визначити цю чергу в нашому config/queue.php конфігураційному файлі.

Ось приклад того, як повинна виглядати конфігурація:

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

Після того, як ми визначили чергу синхронізації у другому додатку Laravel, ми можемо розпочати процес роботи в черзі.

php artisan queue:work sync

Ця команда запускає роботу черги, яка слухає чергу "за замовчуванням" при підключенні "синхронізації" та обробляє завдання, відправлені до неї з першого додатка Laravel.

Висновок

У цьому блозі ми вивчили, як налаштувати дві програми Laravel для підключення до одного екземпляра Redis і використовувати його для диспетчеризації та обробки завдань синхронізації.

Дотримуючись наведених вище кроків, ви можете забезпечити безперебійний зв'язок між вашими програмами Laravel і використовувати потужність Redis для підвищення продуктивності.

Крім того, ми навчилися використовувати користувацьке підключення черги та встановили спеціальний префікс ключів для Redis, щоб підтримувати ізоляцію даних від інших робіт.

Ми сподіваємося, що цей посібник допоможе вам у створенні ефективних та синхронізованих додатків Laravel.

Посилання:

Документація Laravel: черги

Laravel Документація: Redis

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

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...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297