Транспорт Redis в Nest
TCP связывает два процесса на одной машине напрямую, но при нескольких экземплярах нужен общий посредник. Без него клиент не знает, какой слушатель свободен, хотя логика та же.
Транспорт Redis в Nest
задают через Transport.REDIS
с адресом локального сервера.
Ставят пакет ioredis,
настройку повторяют и у клиента
в ClientsModule, и у
слушателя при создании или
подключении микросервиса.
Шаблоны сообщений и возврат
данных из обработчика работают
так же, меняется только посредник.
Покажем на примере постов:
npm install ioredis
HTTP приложение регистрирует клиента с Redis:
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { PostController } from './post.controller.js';
import { PostClientService } from './post.client.service.js';
@Module({
imports: [
ClientsModule.register([
{
name: 'POST_SERVICE',
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
},
},
]),
],
controllers: [PostController],
providers: [PostClientService],
})
export class AppModule {}
Отдельный процесс слушателя использует тот же транспорт:
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module.js';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
},
},
);
await app.listen();
}
bootstrap();
Обработчик по-прежнему возвращает список из памяти:
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
@Controller()
export class PostMicroserviceController {
posts: { title: string }[] = [];
@MessagePattern({ cmd: 'list_posts' })
listPosts() {
return this.posts;
}
}
Клиентский сервис ждёт ответ через Redis так же, как по TCP:
import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { firstValueFrom } from 'rxjs';
@Injectable()
export class PostClientService {
client: ClientProxy;
constructor(@Inject('POST_SERVICE') client: ClientProxy) {
this.client = client;
}
async listPosts() {
return firstValueFrom(
this.client.send({ cmd: 'list_posts' }, {}),
);
}
}
Переведите клиент и слушатель
работников на Redis локального
сервера, сохраните отправку
списка через
WorkerClientService
и ответ WorkerMicroserviceController.