Тестовое задание в Messagio.
Пример микросервиса, который читает сообщения из Kafka, находится в репозитории messagio_tg_processing. В нём реализована отправка полученных сообщений в телеграм-канал.
Разработать микросервис на Go, который будет принимать сообщения через HTTP API, сохранять их в PostgreSQL, а затем отправлять в Kafka для дальнейшей обработки. Обработанные сообщения должны помечаться. Сервис должен также предоставлять API для получения статистики по обработанным сообщениям. Требования:
- Использовать Go 1.20+
- Использовать PostgreSQL для хранения сообщений
- Реализовать отправку и чтение сообщений в Kafka
- Предоставить возможность запустить проект в Docker
- Запуск
- API
- Используемые технологии
- Основные фичи решения
- Архитектура решения
- Описание структуры проекта
docker compose up -d --build
Описание API находится в файле api.md.
Также при запуске сервера доступна Swagger страница по адресу
/
или /swagger/
с описанием API и возможностью протестировать его.
Описание находится в файле kafka.md.
- REST API (go-chi)
- PostgreSQL (pgx)
- Kafka (sarama) и kafka-ui (:8090)
- Docker и docker-compose.
- Testcontainers
- Swagger
- Юнит и интеграционные тесты для PostgreSQL и REST API.
- Чистая архитектура (также известна как луковичная, гексагональная).
- Graceful shutdown.
- Continious Integration с GitHub Actions.
- Логирование и конфигурация приложения.
- Swagger-документация.
- Rate-Limitting.
- Миграции БД и сетап топиков у брокера сообщений.
.
├── cmd
│ ├── envdescription # Программа для генерации описания env конфига.
│ └── server # Сервер
├── configs # Конфиги
├── docs # Swagger-документация
├── internal
│ ├── adapters # Адаптеры (клиенты)
│ │ ├── kafkaprod # Kafka Producers
│ │ │ └── dto # Data Transfer Object для kafkaprod
│ │ └── pgstore # PostgreSQL хранилище
│ ├── config # Пакет для работы с конфигами
│ ├── domain # Доменные модели
│ │ └── message # Модели для того, что относится к сообщению
│ ├── graceful # Пакет для Graceful Shutdown
│ ├── logger # Пакет для логгинга
│ ├── ports # Порты (компоненты, к которым обращаются извне)
│ │ ├── kafkacons # Kafka Consumers
│ │ │ └── dto # Data Transfer Object для kafkacons
│ │ └── rest # HTTP сервер с REST API
│ │ ├── dto # Data Transfer Object для rest
│ │ └── mocks # Моки для usecases в rest
│ └── usecases # Сценарии использования
└── migrations # Миграции для БД
Структура проекта построена в соответствии с чистой архитектурой.
Data Transfer Object нужен для сериализации и десереализации запросов и ответов.