Умеет ли NestJS работать с TCP
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
NestJS и работа с TCP
Да, NestJS полностью поддерживает работу с TCP. Более того, это один из встроенных транспортных слоев, который часто недооценивают разработчики, привыкшие только к HTTP/REST API.
Встроенная поддержка TCP в NestJS
NestJS предоставляет Microservices модуль, который включает TCP в качестве одного из основных транспортов:
- TCP — для синхронной коммуникации между сервисами
- Redis — для pub/sub паттерна
- RabbitMQ — для message queues
- MQTT — для IoT
- NATS — для облачных приложений
- Kafka — для event streaming
- gRPC — для высокопроизводительной RPC
Как создать TCP сервер в NestJS
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3001,
},
},
);
await app.listen();
console.log('TCP Microservice is listening...');
}
bootstrap();
Обработчик сообщений (Message Pattern)
import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
import { OrderService } from './order.service';
@Controller()
export class OrderController {
constructor(private readonly orderService: OrderService) {}
// Обработчик сообщений по pattern
@MessagePattern('order.create')
async handleCreateOrder(@Payload() data: CreateOrderDto) {
return this.orderService.create(data);
}
@MessagePattern('order.findById')
async handleFindOrder(@Payload() id: string) {
return this.orderService.findById(id);
}
@MessagePattern({ cmd: 'order.update' })
async handleUpdateOrder(@Payload() data: UpdateOrderDto) {
return this.orderService.update(data.id, data);
}
}
Как вызвать TCP сервис (клиентская сторона)
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
@Module({
imports: [
ClientsModule.register([
{
name: 'ORDER_SERVICE',
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3001,
},
},
]),
],
})
export class GatewayModule {}
Использование в контроллере
import { Controller, Get, Param, Inject } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';
import { firstValueFrom } from 'rxjs';
@Controller('api/orders')
export class ApiController {
constructor(
@Inject('ORDER_SERVICE') private orderService: ClientProxy,
) {}
@Get(':id')
async getOrder(@Param('id') id: string) {
// Вызываем микросервис по TCP
return firstValueFrom(
this.orderService.send('order.findById', id),
);
}
@Get()
async createOrder() {
// Асинхронный вызов с emit (без ожидания ответа)
this.orderService.emit('order.create', {
userId: '123',
amount: 99.99,
});
return { status: 'Processing...' };
}
}
Гибридное приложение (HTTP + TCP)
Одна из главных фишек NestJS — можно запустить одно приложение с несколькими транспортами одновременно:
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';
async function bootstrap() {
// Создаем HTTP приложение
const httpApp = await NestFactory.create(AppModule);
// Подключаем TCP микросервис к этому же приложению
httpApp.connectMicroservice<MicroserviceOptions>({
transport: Transport.TCP,
options: {
host: '127.0.0.1',
port: 3001,
},
});
// Запускаем оба параллельно
await httpApp.startAllMicroservices();
await httpApp.listen(3000);
console.log('HTTP на 3000, TCP на 3001');
}
bootstrap();
Практические примеры использования TCP
Сценарий 1: Микросервисная архитектура
API Gateway (HTTP 3000)
|
+-- OrderService (TCP 3001)
+-- PaymentService (TCP 3002)
+-- UserService (TCP 3003)
Пользователь обращается только к Gateway по HTTP, а Gateway общается с микросервисами по TCP.
Сценарий 2: Real-time системы
TCP лучше подходит для real-time приложений, чем HTTP, т.к. соединение persistent, нет overhead каждого HTTP запроса.
// Быстрый обмен данными между сервисами
@MessagePattern('notifications.send')
async sendNotification(@Payload() data: Notification) {
// Обработка происходит гораздо быстрее, чем через HTTP
return this.notificationService.process(data);
}
Преимущества TCP в NestJS
- Производительность — меньше overhead, чем HTTP
- Persistent connection — соединение постоянно открыто
- Низкая задержка — идеально для микросервисов
- Масштабируемость — обработка большого количества сообщений
- Встроенный — не нужно искать дополнительные библиотеки
Недостатки TCP
- Отладка сложнее — нельзя просто открыть браузер
- Статeless — нет встроенной поддержки сессий (как в HTTP)
- Балансировка сложнее — нужны специальные load balancers для TCP
Производительность: TCP vs HTTP
Типичные числа:
- HTTP — 5-10ms для простого запроса
- TCP (NestJS) — 0.5-2ms для простого запроса
Для high-load систем эта разница критична.
Заключение
NestJS отлично поддерживает TCP и это мощный инструмент для построения распределенных систем. Я использую TCP для:
- Микросервисной архитектуры
- Real-time систем
- High-load приложений, где важна производительность
- Синхронной RPC коммуникации между сервисами
Таким образом, NestJS не ограничивается только HTTP/REST API — это полноценный framework для любой архитектуры.