• Время чтения ~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 задание и используйте соединение

«sync».Метод 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 задание и используйте соединение

«sync».Теперь мы определим 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. Отправка задания синхронизации Послетого, как ваш класс задания написан, вы можете отправить его, используя метод dispatch для фактического задания

в первом приложении Laravel.

Конструктор задания получит следующие аргументы, которые были переданы методу dispatch:

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

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

После того, как вы отправили свое SynchronizeItem задание в очередь, нам нужно запустить queue worker на втором приложении 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,
    ],
]

мы можем запустить рабочий процесс очереди.

php artisan queue:work sync

Эта команда запускает воркер очереди, который прослушивает очередь «по умолчанию» при подключении «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