Минимальный HTTP API + асинхронная обработка через RabbitMQ. Два сервиса: order-service и processor-service.
Требования: Docker, Docker Compose, Git.
git clone https://github.com/stepangreenberg/order-processor.git
cd order-processor/infra
docker-compose up -d
docker-compose psКомпоненты: RabbitMQ (5672/15672), order-db (5433), processor-db (5434), order-service (8000), processor-service (8001).
Логи:
docker-compose logs -f # все
docker-compose logs -f order-service
docker-compose logs -f processor-serviceМиграции (order-service, при необходимости):
docker exec -it order_processor-order-service alembic upgrade headОстановка:
docker-compose down # без удаления данных
docker-compose down -v # с удалением данных- POST /orders — создать заказ (идемпотентно)
- GET /orders/{order_id} — статус заказа (поле
fail_reasonприсутствует при failed) - GET /health — healthcheck (оба сервиса)
- GET /metrics — простые метрики (оба сервиса)
Примеры пейлоада:
Успех (запрос):
{
"order_id": "ord-sample-success",
"customer_id": "cust-123",
"items": [
{"sku": "laptop", "quantity": 1, "price": 1200.0},
{"sku": "mouse", "quantity": 2, "price": 25.0}
]
}Запрещённые SKU (уйдёт в failed с причиной эмбарго):
{
"order_id": "ord-embargo-1",
"customer_id": "cust-embargo",
"items": [
{"sku": "pineapple_pizza", "quantity": 1, "price": 15.0},
{"sku": "teapot", "quantity": 1, "price": 30.0}
]
}Ответы (POST /orders и GET /orders/{order_id} — схема одна и та же):
- Успех:
{
"order_id": "ord-sample-success",
"customer_id": "cust-123",
"status": "done",
"total_amount": 1250.0,
"version": 2,
"fail_reason": null
}- Провал с эмбарго:
{
"order_id": "ord-embargo-1",
"customer_id": "cust-embargo",
"status": "failed",
"total_amount": 45.0,
"version": 2,
"fail_reason": "Pineapple/teapot embargo"
}Внутри контейнеров:
docker exec -it order_processor-order-service pytest tests/ -v
docker exec -it order_processor-processor-service pytest tests/ -vЛокально (Python 3.12+):
cd order-service && python3 -m pip install -r requirements.txt && python3 -m pytest tests/ -v
cd processor-service && python3 -m pip install -r requirements.txt && python3 -m pytest tests/ -vТесты используют Testcontainers для интеграции с реальными PostgreSQL и RabbitMQ.
- Order service: Alembic (
order-service/alembic/versions/*). Применение:alembic upgrade head(см. выше). - Processor service: схема создаётся через SQLAlchemy
metadata.create_all()при старте.
- Краткое описание и паттерны: ARCHITECTURE.md
- Ключевые идеи: Event-driven, Outbox/Inbox, retries+DLQ, оптимистичная версионность, чистая архитектура (Domain/Application/Infrastructure).
order-service/ # HTTP API, БД, outbox/inbox, Alembic
processor-service/ # Консьюмер, обработка, outbox/inbox
infra/ # docker-compose.yml
ARCHITECTURE.md # краткое архитектурное описание
README.md