Эталонные проекты: Pinkponies Bank
Платёжный сервис
Рабочий платёжный сервис на Go для вымышленного банка. В нём идемпотентное создание платежа, очередь задач на PostgreSQL (SKIP LOCKED и аренда), outbox, опрос шлюза повтором команды, вебхуки, long polling на общем батчере, graceful shutdown, фейковый шлюз со сбоями, веб-страница, Docker Compose и тесты. Достоинства и недостатки разобраны в docs/REVIEW.md, план улучшений — в docs/IMPROVEMENTS.md.
Репозиторий на GitHub · запуск: docker compose up --build, затем http://localhost:8080
Порядок чтения кода
internal/domain/payment — статусы и разрешённые переходы (C57 )
cmd/payments/main.go — сборка зависимостей и порядок остановки (C58 , C59 )
internal/adapters/in/httpapi — маршруты, middleware и long polling (C60 , C62 )
internal/adapters/out/postgres и internal/adapters/in/queue — очередь задач и аренда (C52 , C63 )
internal/app/start.go — вызов шлюза и намеренная слабость v1; docs/proposals/0001-gateway-call-outside-transaction.md — как её убрать (C51 )
Банк из трёх сервисов
Продолжение платёжного сервиса: межсервисные паттерны, которых нет в одном сервисе. ledger на gRPC — счета, двойная запись и холды со сроком действия; transfers на REST — перевод как оркестрируемая сага (холд → проверка во внешнем сервисе → списание или возврат холда), outbox в Kafka, long polling и веб-страница; notifications — идемпотентный консьюмер Kafka с дедупликацией и dead-letter topic; фейковый сервис проверки со сбоями. У каждого сервиса своя база. Соглашения и helper'ы взяты из платёжного сервиса; достоинства и недостатки — в docs/REVIEW.md, план — в docs/IMPROVEMENTS.md.
Репозиторий на GitHub · запуск: docker compose up --build, затем http://localhost:8080
Порядок чтения кода
docs/ARCHITECTURE.md — сервисы, контракты и потоки на диаграммах
internal/ledger и internal/ledger/grpcapi — двойная запись, холды, блокировки и контракт ошибок gRPC (C50 , C61 )
docs/SAGA.md и internal/transfers/app/saga.go — шаги саги, компенсация и сбой в каждой точке (C68 , C70 )
internal/transfers/outbox и internal/notifications/consumer — outbox в Kafka и консьюмер с дедупликацией (C52 , C53 )