Микросервис массовой рассылки 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Базовый URL: http://localhost:8080/api/v1
Принимает запрос и ставит уведомления в очередь. Ответ 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"]
}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/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) |