Интеграциялар · Go · REST API
Go-дағы интернет-дүкен REST API-ы: дубликатсыз тапсырыстар және минусқа кетпейтін қалдықтар
Клиент:
Жеке жоба
Санат: Интеграциялар
Стек: Go 1.25, chi, PostgreSQL 16, pgx, sqlc, golang-migrate, JWT, bcrypt, zap, Docker Compose, GitHub Actions, golangci-lint
Мерзім: жеке жоба, 2025
Мәселе
Жұмыс трафигінің типтік жағдайларын дұрыс көтере алатын дүкен API-ы керек болды: байланыс үзілгенде тапсырысты қайта жіберу және тауардың соңғы бірліктерін бір мезгілде сатып алу.
Шектеулер
Сұранысты қайталау екінші тапсырыс жасамауы, бәсекелес тапсырыстарда қалдық минусқа кетпеуі, ал сомалар float дөңгелектеу қателерінсіз есептелуі керек.
Не істедім
- JWT-аутентификация: 15 минуттық access-токен және дерекқорда тек хеш түрінде сақталатын refresh-токен; user және admin рөлдері, құпиясөздер — bcrypt
- Idempotency-Key тақырыбы бойынша тапсырыстардың идемпотенттілігі: қайталанған сұраныс сақталған жауапты қайтарады, кілттер 24 сағат сақталады
- Қалдықтарды транзакцияда атомарлы есептен шығару: шартты UPDATE минусқа кетуге жол бермейді, тапсырысты болдырмау тауарды қоймаға қайтарады
- sqlc және golang-migrate миграцияларына негізделген деректер қабаты, сомалар — float-та емес, decimal-да
- Каталогты беттеу, сүзгілеу және сұрыптау, кіріс деректерін валидациялау, IP бойынша rate limit, graceful shutdown, zap құрылымдық журналдары
- OpenAPI 3.0 (10 жол) және Postman-коллекциясы; CI: жинау, миграциялар, -race бар 20 модульдік тест және golangci-lint
Архитектура
chi-роутер + middleware
→ Сервис қабаты
→ sqlc-репозиторийлер
→ PostgreSQL 16 (транзакциялар)
→ OpenAPI / Postman
Нәтиже
API «тіркелу → каталог → тапсырыс → төлем немесе болдырмау» циклін толық жабады және қайталаулар мен бәсекелес тапсырыстарда болжамды әрекет етеді; әр өзгеріс CI-да тексеріледі.
Нені қайта қолдануға болады
Idempotency-Key бойынша POST-сұраныстардың идемпотенттілігі
Транзакцияда шартты UPDATE арқылы қалдықтарды атомарлы есептен шығару
Go-сервис қаңқасы: chi, sqlc, zap, golangci-lint бар CI