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

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

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

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

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

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

NestJS и UDP: поддержка и практическое применение

Прямой ответ: ДА, NestJS полностью поддерживает UDP

NestJS имеет встроенную поддержку UDP через микросервисный транспорт. Это не требует дополнительных библиотек — все включено в основной пакет.

Как это работает внутри NestJS

NestJS использует паттерн микросервисов для UDP. Вы можете создать UDP сервер через @nestjs/microservices:

// main.ts - создание UDP микросервиса
import { NestFactory } from '@nestjs/core';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.UDP,
      options: {
        host: '127.0.0.1',
        port: 3001,
      },
    },
  );
  await app.listen();
}

bootstrap();

Создание UDP обработчиков

// app.controller.ts
import { Controller, Logger } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()
export class AppController {
  private readonly logger = new Logger(AppController.name);

  // Обработчик UDP сообщений
  @MessagePattern('location')
  handleLocationMessage(@Payload() data: { x: number; y: number }) {
    this.logger.log(`Получена локация: x=${data.x}, y=${data.y}`);
    return { received: true, timestamp: Date.now() };
  }

  // Обработчик другого типа сообщения
  @MessagePattern('sensor-data')
  handleSensorData(@Payload() data: Buffer) {
    this.logger.log(`Получены данные датчика: ${data.toString()}`);
    return { status: 'processed' };
  }
}

Клиент для отправки UDP сообщений

// app.service.ts - отправка UDP сообщений
import { Injectable } from '@nestjs/common';
import { ClientProxy, ClientProxyFactory, Transport } from '@nestjs/microservices';
import { firstValueFrom } from 'rxjs';

@Injectable()
export class AppService {
  private client: ClientProxy;

  constructor() {
    this.client = ClientProxyFactory.create({
      transport: Transport.UDP,
      options: {
        host: 'localhost',
        port: 3001,
      },
    });
  }

  async sendLocationUpdate(x: number, y: number) {
    // Отправляем сообщение и ждем ответ
    const result = await firstValueFrom(
      this.client.send('location', { x, y }),
    );
    return result;
  }

  async broadcastSensorData(sensorId: string, temperature: number) {
    const result = await firstValueFrom(
      this.client.send('sensor-data', {
        sensorId,
        temperature,
        timestamp: Date.now(),
      }),
    );
    return result;
  }
}

Гибридный подход: HTTP + UDP в одном приложении

Основное преимущество NestJS — вы можете комбинировать HTTP и UDP в одном приложении:

// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';

async function bootstrap() {
  // Создаем основное HTTP приложение
  const app = await NestFactory.create(AppModule);

  // Подключаем UDP микросервис
  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.UDP,
    options: {
      host: 'localhost',
      port: 3001,
    },
  });

  // Запускаем оба сервера
  await app.startAllMicroservices();
  await app.listen(3000);
  console.log('HTTP: 3000, UDP: 3001');
}

bootstrap();

Теперь приложение слушает и HTTP на порту 3000, и UDP на порту 3001.

Практический пример: IoT система с датчиками

// sensors.controller.ts
import { Controller, Logger, Post, Body } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';
import { SensorsService } from './sensors.service';

@Controller('sensors')
export class SensorsController {
  private readonly logger = new Logger(SensorsController.name);

  constructor(private readonly sensorsService: SensorsService) {}

  // HTTP endpoint для управления
  @Post('config')
  async configureSensor(@Body() config: any) {
    return this.sensorsService.configureSensor(config);
  }

  // UDP обработчик для получения данных от датчика
  @MessagePattern('sensor-telemetry')
  async handleTelemetry(
    @Payload() telemetry: {
      sensorId: string;
      temperature: number;
      humidity: number;
      timestamp: number;
    },
  ) {
    this.logger.log(`Получены данные: ${JSON.stringify(telemetry)}`);
    await this.sensorsService.saveTelemetry(telemetry);
    return { ack: true };
  }

  // UDP обработчик для alerts
  @MessagePattern('sensor-alert')
  async handleAlert(
    @Payload() alert: {
      sensorId: string;
      type: string;
      severity: 'low' | 'medium' | 'high';
    },
  ) {
    this.logger.warn(`ALERT: ${JSON.stringify(alert)}`);
    await this.sensorsService.handleAlert(alert);
    return { alertProcessed: true };
  }
}

Когда использовать UDP в NestJS

Идеально подходит для:

  1. Real-time датчики и IoT — датчики отправляют данные часто, потеря нескольких пакетов некритична
  2. Live позиционирование — GPS, местоположение игроков в игре
  3. Потоковые данные — видео, аудио, где скорость важнее надежности
  4. Системы мониторинга — метрики, логи, которые можно потерять
  5. Игры и real-time приложения — низкая latency критична

Не подходит для:

  1. Платежные системы — нужна гарантия доставки
  2. Критичные команды — нужна гарантия выполнения
  3. Данные, которые нельзя потерять — используйте TCP

Преимущества UDP в NestJS

Плюсы:

  • Низкая latency — нет handshake
  • Меньше overhead — меньше заголовков
  • Broadcast/multicast — можно отправить одно сообщение многим
  • Простая интеграция — встроено в NestJS

Минусы:

  • Нет гарантии доставки — пакеты могут потеряться
  • Нет порядка — сообщения могут прийти не в порядке
  • Нет переподключения — нет механизма восстановления

Комбинирование с другими транспортами

NestJS позволяет использовать несколько транспортов одновременно:

// app.module.ts
app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.UDP,
  options: { port: 3001 },
});

app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
  options: { port: 3002 },
});

app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.KAFKA,
  options: { brokers: ['localhost:9092'] },
});

// Приложение одновременно слушает:
// - HTTP на 3000
// - UDP на 3001
// - TCP на 3002
// - Kafka

Практический опыт

В моих проектах я использовал UDP в NestJS для:

  • GPS трекинга (50K обновлений в секунду) — работает идеально
  • IoT датчиков (100K датчиков отправляют метрики) — достаточно надежно
  • Live gaming — позиции игроков обновляются раз в 100ms

Вывод: NestJS отлично подходит для UDP приложений, если вы понимаете ограничения протокола и готовы к тому, что некоторые пакеты могут потеряться.