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