Cервис принимает изображения, кладёт задачу на обработку в очередь (Apache Kafka), в фоне обрабатывает файл (ресайз, наложение водяного знака, миниатюра).
Сервис принимает изображение по REST API, генерирует ключ для оригинала, сохраняет изображение в S3(Garage), в единой транзакции - метаданные(ключ, размер, статус, ...) в основную таблицу postgresql, метаданные(payload для обработки) в outbox-таблицу postgresql, в случае неудачи удаляет из S3.
Фоновый outbox-relay воркер по тикеру читает outbox-таблицу, забирает pending ивенты, отправляет их в очередь.
Kafka в качестве controller'а слушает топик, забирает задачи и отдает их на выполнение сервису обработки изображений(disintegration/imaging). Реализован worker pool.
В случае успеха сохраняет обработанное изображение в S3 по новому ключу, обновляет метаданные в БД, коммитит прочитанные из топика сообщения.
Поддерживаемые форматы - .jpg .jpeg .png .webp
Видео запуска и работы - https://drive.google.com/file/d/1KgmaMPTDyw14cH_3X2S7K_lSqsyngBMU/view
- UI - http://localhost:8080/v1
- Документация API - Swagger - http://localhost:8080/swagger
- Конфиг - config/config.go. Читается из
.envфайла. - Удобная и гибкая конфигурация HTTP сервера - pkg/httpserver/options.go.
Позволяет конфигурировать сервер в конструкторе таким образом:
Подобный подход используется и в остальных pkg.
httpServer := httpserver.New(httpserver.Port(cfg.HTTP.Port), httpserver.Prefork(cfg.HTTP.UsePreforkMode))
- В слое контроллеров, для REST API применяется версионирование - internal/controller/restapi/v1.
Для версии v2 нужно будет просто добавить папку
restapi/v2с таким же содержимым, в файле internal/controller/restapi/router.go добавить строку:
{
v1.NewImageRoutes(apiV1Group, img, l) // v1
}
{
v2.NewImageRoutes(apiV1Group, img, l) // v2
}- Graceful shutdown - internal/app/app.go.
-
Клонируйте репозиторий
-
В корне создайте
.envфайл, скопируйте туда содержимое env.example:cp .env.example .env -
В корне создайте
garage.toml, скопируйте туда содержимое garage.toml.example:cp garage.toml.example garage.toml -
Запуск S3 Garage, выполните, дождитесь запуска:
make compose-up-garage -
Конфигурация кластера Garage(ёмкость ноды, зона, создание бакета, ключа, определение прав доступа ключа к бакету).
Для windows:
make setup-garage-winДля linux:
make setup-garage-lin -
Запуск остальных сервисов(postgres, kafka, backend):
make compose-up-all -
Перейдите на http://localhost:8080/v1 и пользуйтесь сервисом.
- Перейдите на http://localhost:8080/swagger и ознакомьтесь с API, если хотите взаимодействовать с сервисом вручную или из стороннего сервиса.
docker compose down:
make compose-down
docker compose down -v, удаление всех данных Garage:
make down-n-clean
Зависимости:
make deps