← Назад к вопросам

Умеет ли NestJS работать с TCP

2.0 Middle🔥 151 комментариев
#API и сетевые протоколы#Фреймворки и библиотеки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

  1. Производительность — меньше overhead, чем HTTP
  2. Persistent connection — соединение постоянно открыто
  3. Низкая задержка — идеально для микросервисов
  4. Масштабируемость — обработка большого количества сообщений
  5. Встроенный — не нужно искать дополнительные библиотеки

Недостатки TCP

  1. Отладка сложнее — нельзя просто открыть браузер
  2. Статeless — нет встроенной поддержки сессий (как в HTTP)
  3. Балансировка сложнее — нужны специальные 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 для любой архитектуры.

Умеет ли NestJS работать с TCP | PrepBro