Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Notification Service

Микросервис массовой рассылки SMS и Email с приоритизацией, идемпотентностью и асинхронной доставкой через RabbitMQ.

Стек

  • PHP 8.4 + Laravel 13
  • PostgreSQL — хранение уведомлений и статусов
  • RabbitMQ — очереди high (транзакционные) и default (маркетинг)
  • Redis — идемпотентность и rate limiting
  • Docker + docker-compose

Быстрый старт

Требования

  • Docker и Docker Compose

Запуск

# 1. Клонировать репозиторий
git clone <repo-url>
cd notification-service

# 2. Поднять все сервисы
docker compose up -d --build

# 3. Дождаться готовности (миграции выполняются автоматически в entrypoint)
docker compose ps

Сервис будет доступен на http://localhost:8080.

Health-check: GET http://localhost:8080/up

Остановка

docker compose down

Данные PostgreSQL и RabbitMQ сохраняются в Docker volumes. Полная очистка:

docker compose down -v

API

Базовый URL: http://localhost:8080/api/v1

POST /notifications — массовая отправка

Принимает запрос и ставит уведомления в очередь. Ответ 202 Accepted.

curl -X POST http://localhost:8080/api/v1/notifications \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "email",
    "text": "Ваш код доступа: 4821",
    "recipients": ["user@example.com"],
    "priority": "high",
    "idempotency_key": "order-123"
  }'

Поля:

Поле Тип Обязательно Описание
channel string да sms или email
text string да Текст сообщения (до 2000 символов)
recipients string[] да Адреса получателей (1–1000)
priority string нет high (транзакционные) или default (маркетинг). По умолчанию default
idempotency_key string нет Ключ защиты от дублей при повторном запросе

Ответ:

{
  "accepted": ["550e8400-e29b-41d4-a716-446655440000"]
}

GET /notifications/recipient/{id} — история получателя

curl http://localhost:8080/api/v1/notifications/recipient/user@example.com

Ответ:

{
  "recipient": "user@example.com",
  "items": [
    {
      "uuid": "550e8400-e29b-41d4-a716-446655440000",
      "channel": "email",
      "recipient": "user@example.com",
      "status": "доставлено",
      "text": "Ваш код доступа: 4821",
      "priority": "high",
      "attempts": 1,
      "created_at": "2026-06-09T12:00:00+00:00",
      "sent_at": "2026-06-09T12:00:01+00:00",
      "delivered_at": "2026-06-09T12:00:02+00:00",
      "discarded_at": null
    }
  ]
}

Статусы жизненного цикла

Статус Значение
в очереди Принято, ожидает обработки
отправлено Передано провайдеру
доставлено Подтверждено провайдером
отброшено Ошибка после исчерпания попыток

Архитектура

HTTP API → Use Case → PostgreSQL (статус «в очереди»)
                    → RabbitMQ (очередь high / default)
                              ↓
                     Queue Worker → Redis (idempotency + rate limit)
                                  → Mock Provider (SMS / Email)
                                  → PostgreSQL (обновление статуса)

Приоритет: worker читает очередь high раньше default (--queue=high,default).

Тесты

# Внутри контейнера app
docker compose exec app php artisan test

# Или локально (нужен vendor)
composer test

Покрыты сценарии: массовая отправка, идемпотентность, обработка job → статус в БД, история получателя.

Postman

Импортируйте коллекцию: postman/Notification-Service.postman_collection.json

Переменная base_url по умолчанию: http://localhost:8080/api/v1

Полезные порты

Сервис Порт
API (Nginx) 8080
PostgreSQL 5432
Redis 6379
RabbitMQ AMQP 5672
RabbitMQ Management UI 15672 (guest/guest)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages