Nest.js проект с двумя сервисами:
producerпринимает HTTP-запросы, создает событие с UUID/idempotency key и публикует JSON в RabbitMQ с publisher confirms и ретраями.consumerчитает очередь RabbitMQ, вручную подтверждает обработку, повторно отправляет ошибки через retry-очередь и после лимита переносит сообщения в DLQ.TelegramNotificationServiceотправляет обработанные события в Telegram Bot API.
Copy-Item .env.example .env
docker compose up --buildProducer API: http://localhost:3000
Swagger: http://localhost:3000/docs
RabbitMQ UI: http://localhost:15672 (guest / guest)
Для реальной отправки в Telegram укажите в .env:
TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=123456:bot-token
TELEGRAM_CHAT_ID=123456789Без этих значений consumer обработает событие как успешное, но отправка в Telegram будет отключена.
Invoke-RestMethod -Method Post http://localhost:3000/events `
-ContentType 'application/json' `
-Body '{
"type": "order.created",
"payload": {
"orderId": "ORD-1001",
"customerName": "Ivan Petrov",
"total": 1790
},
"metadata": {
"source": "checkout"
}
}'Ответ:
{
"eventId": "generated-or-provided-uuid",
"published": true
}Можно передать свой id, чтобы producer использовал его как idempotency key.
pnpm install
pnpm run build
pnpm run start:producer:prod
pnpm run start:consumer:prodДля dev-режима:
pnpm run start:producer:dev
pnpm run start:consumer:devЕсли RabbitMQ запущен локально, установите:
RABBITMQ_URL=amqp://guest:guest@localhost:5672Основные переменные окружения:
RABBITMQ_URL- URL подключения к RabbitMQ.RABBITMQ_EXCHANGE,RABBITMQ_ROUTING_KEY,RABBITMQ_QUEUE- основная топология событий.RABBITMQ_RETRY_EXCHANGE,RABBITMQ_RETRY_QUEUE,RABBITMQ_RETRY_DELAY_MS- retry-топология через TTL и dead-letter routing обратно в основную очередь.RABBITMQ_DEAD_LETTER_EXCHANGE,RABBITMQ_DEAD_LETTER_QUEUE- DLQ для невалидных сообщений и сообщений после исчерпания ретраев.RABBITMQ_PUBLISH_RETRIES,RABBITMQ_CONNECTION_RETRIES- ретраи отправки и подключения.PROCESSING_RETRY_ATTEMPTS- лимит повторной обработки consumer.TELEGRAM_ENABLED,TELEGRAM_BOT_TOKEN,TELEGRAM_CHAT_ID- настройки Telegram Bot API.
pnpm run lint
pnpm run test
pnpm run test:e2e
pnpm run buildIdempotency сейчас реализована in-memory на стороне consumer. Для production ее стоит заменить на Redis или базу данных, чтобы ключи переживали рестарты сервиса.