Событие без ответа в Nest
После записи строки страница не должна ждать, пока соседний процесс закончит побочный шаг. Запрос с ответом удерживает HTTP соединение, хотя достаточно лишь сообщить факт по каналу.
Клиент микросервиса умеет слать событие: отправка идёт без ожидания данных обратно. На стороне слушателя метод помечают шаблоном события на латинице, тело попадает в параметр с полезной нагрузкой. Так веб процесс быстро отвечает клиенту, а удалённый класс ведёт счётчик или журнал в памяти.
Покажем на примере постов:
import { Controller } from '@nestjs/common';
import { EventPattern, Payload } from '@nestjs/microservices';
@Controller()
export class PostMicroserviceController {
createdCount = 0;
@EventPattern('post_created')
handlePostCreated(@Payload() data: { title: string }) {
this.createdCount += 1;
}
}
Клиентский сервис после сохранения шлёт сигнал и не ждёт ответа:
import { Inject, Injectable } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
@Injectable()
export class PostClientService {
client: ClientProxy;
constructor(@Inject('POST_SERVICE') client: ClientProxy) {
this.client = client;
}
notifyCreated(title: string) {
this.client.emit('post_created', { title });
}
}
HTTP сервис сохраняет заголовок локально и сразу уведомляет соседний процесс:
import { Injectable } from '@nestjs/common';
import { PostClientService } from './post.client.service.js';
@Injectable()
export class PostService {
posts: { title: string }[] = [];
postClientService: PostClientService;
constructor(postClientService: PostClientService) {
this.postClientService = postClientService;
}
create(title: string) {
const post = { title };
this.posts.push(post);
this.postClientService.notifyCreated(title);
return post;
}
}
После добавления работника
в память WorkerService
шлите сигнал через
WorkerClientService
и увеличивайте счётчик
в поле WorkerMicroserviceController.