Мини-сервис для обработки заказов: читает события из Kafka (Redpanda), сохраняет их в PostgreSQL и отдаёт через HTTP API и простую веб-страницу.
- Ingest: Kafka consumer (Redpanda) читает события из
orders, валидирует вход и преобразует DTO в доменную модель. Ошибки уходят в DLQ. - Service:
OrderServiceпишет заказ в БД в транзакции и обслуживает чтение. - Storage: PostgreSQL с разнесением по схемам
ordersиbanks. - Cache: in-memory кэш по
order_idс TTL, прогрев из БД за последние 24 часа. - Transport: HTTP API
GET /api/v1/order/{order_id}и статическая страницаweb/index.html.
- Kafka/Redpanda: входящие события приходят асинхронно, нужен устойчивый консьюмер.
- Postgres: нормализованные таблицы и транзакционные upsert-операции.
- Кэш: ускорение частых чтений, отдельный прогрев при старте.
- Отдельные схемы
ordersиbanks: логическое разделение доменов.
Схемы: orders, banks.
Таблицы:
orders.orders: основной заказ (order_idUUID PK).orders.delivery: доставка, связь 1:1 поorder_id.orders.payments: платеж, связь 1:1 поorder_id, ссылка наbanks.banks.orders.items: товары, уникальные поrid.orders.order_items: связь M:N между заказами и товарами.banks.banks: справочник банков.
Связи:
orders.delivery.order_id->orders.orders.order_id(1:1).orders.payments.order_id->orders.orders.order_id(1:1).orders.payments.bank_id->banks.banks.id(N:1).orders.order_items->orders.ordersиorders.items(M:N).
- HTTP API:
GET /api/v1/order/{order_id}возвращает JSON заказа. - Web UI:
web/index.html(форма поискаorder_id, вывод JSON).
8080— приложение (HTTP API + статика).8081— Redpanda Console (веб-интерфейс Kafka).5432— PostgreSQL.19092— Kafka внешняя точка (localhost для клиентов).9092— Kafka внутренняя точка (docker network).
- Консьюмер Kafka (через franz-go/kgo)
- PostgreSQL (таблицы
orders,delivery,payment,item) - Upsert заказов и связанных сущностей
- Кэш заказов в памяти (по
order_uid) - DLQ для невалидных/ошибочных сообщений (
orders_dlq) - Генератор тестовых сообщений (валидных и невалидных)
cmd/producer - HTTP API для получения заказа
- Простой фронтенд (
web/index.html) - Трейсы и логи через декораторы на слоях service/handlers/repository/cache; метрики (Prometheus
/metrics)
# собрать и запустить сервисы
docker compose up -d --build
# смотреть логи приложения
docker compose logs -f app
# открыть фронт в браузере
http://localhost:8080- Основной:
orders - DLQ:
orders_dlq(создаётсяredpanda-initпри старте)
go run ./cmd/producer --brokers=localhost:19092 --topic=orders --count=100 --invalid-rate=0.3Если запускаешь внутри docker‑сети, используй --brokers=redpanda:9092.
По умолчанию доступны по пути /metrics.
Если используешь docker compose, Prometheus поднимется на http://localhost:9090
и уже настроен на скрейп app:8080/metrics. Пример запроса в UI:
http_requests_total.
Дополнительные метрики:
storage_ops_total{store,op,result}— чтение/запись поcacheиdb.repository_up{repo}— доступность репозитория (ping).
Включаются через конфиг:
[telemetry]
enabled = true
service_name = "web_demoservice"
otlp_endpoint = "localhost:4317"
otlp_insecure = true
sample_ratio = 1.0Если enabled=false, трейсинг отключён.
Контекст из Kafka прокидывается через headers и продолжается в service/repository/cache
через декораторы.
HTTP хэндлеры и сервис обёрнуты логирующими декораторами.
# unit
go test ./...
# integration (нужна поднятая БД + миграции)
TEST_DB_DSN="postgres://demoservice:demoservice_pass@localhost:5432/demoservice_db?sslmode=disable" \
go test -tags=integration ./internal/repository -run TestOrderPostgresRepository_CreateAndGetЮнит-тесты покрывают кэш и Kafka producer.
Короткие команды-обертки над docker compose:
make up # db + миграции + kafka + app + prometheus
make down # остановка всех сервисов
make logs # логи app + db
make build # сборка app
make restart # перезапуск app + tail логов
make lint # статический анализ (golangci-lint)
make obs-up # PrometheusЛинтер: golangci-lint, настройки в .golangci.yml.
# линт
make lint
# форматирование (goimports)
golangci-lint fmt