РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpMcRds 166 of 201 menu
◀ ▶

Транспорт 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить