Service that listens Kafka topic for new people and adds them to PostgreSQL database. All failed requests being redirected to another Kafka topic. Database can also be accessed through REST/GraphQL API (Get, add, update or delete people). REST API has Redis cache.
bash scripts/migration/go-get-psql.sh # Install go migrate for postgres
bash scripts/migration/migrate.sh # Migrate tables from scripts/migration/migrations
bash scripts/kafka/zookeeper.sh # Run zookeeper to run Kafka
bash scripts/kafka/kafka.sh # Run Kafka
bash scripts/kafka/k-producer.sh # Run Kafka producer for topic from .env (FIO)
bash scripts/kafka/k-consumer.sh # Run Kafka consumer for topic from .env (FIO_FAILED)
kafka producer + consumer w/ docker https://habr.com/ru/articles/738874/
go run github.com/99designs/gqlgen init # USE ONLY ONCE: Init files
go run github.com/99designs/gqlgen generate # Generate code if schema.graphqls updated
go run app/app
Реализовать сервис, который будет получать поток ФИО, из открытых api обогащать ответ наиболее вероятными возрастом, полом и национальностью, и сохранять данные в БД. По запросу выдавать инфу о найденных людях. Необходимо реализовать следующее
- Сервис слушает очередь Kafka FIO, в котором приходит информация с ФИО в формате
{
"name": "Dmitriy",
"surname": "Ushakov",
"patronymic": "Vasilevich" // необязательно
}
- В случае некорректного сообщения, обогатить его причиной ошибки (нет обязательного поля, некорректный формат...) и отправить в очередь Kafka
FIO_FAILED
- Корректное сообщение обогатить
- Возрастом - https://api.agify.io/?name=Dmitriy
- Полом - https://api.genderize.io/?name=Dmitriy
- Национальностью - https://api.nationalize.io/?name=Dmitriy
- Обогащенное сообщение положить в БД postgres (структура БД должна быть создана путем миграций)
- Выставить rest методы
- Для получения данных с различными фильтрами и пагинацией
- Для добавления новых людей
- Для удаления по идентификатору
- Для изменения сущности
- Выставить GraphQL методы аналогичные п. 5
- Для получения данных с различными фильтрами и пагинацией
- Для добавления новых людей
- Для удаления по идентификатору
- Для изменения сущности
- Предусмотреть кэширование данных в Redis (Не добавил для graphql)
- Покрыть код логами
- Покрыть бизнес-логику unit-тестами
- Вынести все конфигурационные данные в .env