Микросервис, предназначенный для работы с персональными данными пользователей. Он предоставляет API для создания, чтения, обновления и удаления данных. Особенностью этого сервиса является интеграция со сторонними API для обогащения fio данных, которые мы получаем из очереди кафки, случайным возрастом, полом и национальностью.
Используемые технологии:
- PostgreSQL (в качестве хранилища данных)
- Docker (для запуска сервиса)
- Swagger (для документации API)
- Gin (веб фреймворк)
- Redis (для кеширования)
- Apache Kafka (для чтения из очереди)
- validator/v10 (для реализации кастомного валидатора)
- uber-go/zap (для логирования)
- golang-migrate/migrate (для миграций БД)
- pgx (драйвер для работы с PostgreSQL)
- golang/mock, testify (для тестирования)
Сервис разработан с использованием современных технологий и следует принципам Clean Architecture, что обеспечивает легкость расширения функционала и тестирования. Также был реализован Graceful Shutdown для корректного завершения работы сервиса.
Для запуска сервиса достаточно заполнить .env файл в корневой директории.
Запустить сервис можно с помощью команды make compose-up
.
Документацию после завпуска сервиса можно посмотреть по адресу http://localhost:8080/swagger/index.html
с портом 8080 по умолчанию.
Для запуска тестов необходимо выполнить команду make test
, для запуска тестов с покрытием make cover
и make cover-html
для получения отчёта в html формате.
В ходе разработки был сомнения по тем или иным вопросам, которые были решены следующим образом:
- Какой использовать тип пагинации?
Каждый способ имеет свои преимущества и недостатки. Limit-Offset теряет в скорости работы и консистентности данных, так как если между получениями смежных страниц, будут добавлены данные, то это приведёт к дублированию и потере записи. От использования курсора пришлось отказаться, так как на одну дату может быть множество операций, тогда затруднительно получить отличные от первой страницы, нужно было бы увеличивать точность даты курсора, что усложнило бы разработку.
- Как добавлять множество fio данных?
Каждый раз при отправке запроса СУБД приходится разбирать полученное SQL-выражение. Если выражения сложные и они регулярно выполняются, можно использовать подготовленные — скомпилированные — SQL-запросы. В некоторых ситуациях они могут заметно увеличить скорость работы с БД. Сервер базы данных может запомнить запрос во внутреннем представлении и не тратить каждый раз время на его разбор из текстовой формы. Планировал внедрить буферизацию или механизм ожидания перед добавлением данных. Однако впоследствии отказался от этой идеи из-за возможных проблем с консистентностью данных. Поднимался вопрос об использовании Redis для решения данной проблемы, но сложности, связанные с пагинацией и фильтрацией, сделали этот вариант неоптимальным.