Приложение состоит из двух основных сервисов: Producer и Consumer, которые взаимодействуют с Kafka. Producer отправляет данные в Kafka, а Consumer читает данные из нее и обрабатывает их, сохраняя в базе данных PostgreSQL. Producer является скриптом записи данных заказа в топик кафки. При реализации consumer реализована слоеная архитектруа. Доступ к прочитанным заказам осуществляется через http интерфейс веб сервера на порту 9090.
-
Docker
-
Go (Version go1.23.2)
-
Posgresql
-
Kafka
Для запуска проетка необходимо:
- Перейти в корневую директорию
- Выполнить команду
docker-compose -f docker-compose.yml build
- Выполнить команду
docker-compose -f docker-compose.yml up --no-start
- Запустить контейнеры zoo и db и дождаться их полного запуска
- Далее запустить контейнер broker и ждём его полного запуска
- Далее запускаем контейнер init-kafka, который выполняет скрипт для создания топика
- Запускаем consumer и producer для генерации и чтения данных.
По адресу localhost:9090 будет доступен веб-интерфейс для получения данных
В приложении реализованы следующие методы:
Получение заказа из базы данных (если такой существует).
Эндпоинт:
GET http://localhost:9090/api/getOrder?OrderUID=uuid
где uuid - uuid необходимого заказа.
При отсутствии query параметра данный метод также проверяет наличие значения OrderUID в JSON-body.
В качестве ответа клиент получает все необходимые данные о заказе в json формате.
Получение заказа через простейший интерфейс
Эндпоинт:
GET http://localhost:9090/
При старте сервиса происходит восстановление кэша последними записанными в базу заказами в соответствии с максимальным размером кэша.
Кэш хранится в оперативной памяти. Оперативная память сервиса ограничена, поэтому внутри сервиса необходимо контролировать размер кэша. Из-за этого в процессе работы сервиса количество заказов в базе будет превышать максимальное количество заказов в кэше, и поэтому необходимо выбрать стратегию поддержания актуальности кэша. В условии ТЗ не прописан паттерн чтения данных, поэтому для вымещения ордеров из кэша была выбрана стратегия вымещения по времени создания (удалять наиболее старые). Максимальный размер кэша определяется в количестве заказов, это число хранится в конфиге сервиса.
При инициализации сервиса кэш заполняется последними вставленными в бд заказами.
Для проекта были написаны юнит-тесты, проверяющие основную логику сервиса consumer. Совместная работа сервисов проверялась вручную.
Скрипт для генерации заказов и отправки в топик "orders" в Kafka, используя библиотеку для работы с Kafka в Go. Для генерации случайных данных использована библиотека gofakeit. Данные отправляются в заданный интервал времени.
Для получения данных из кафки создана группа слушателей "bank". Читаемые из канала данные записываются в базу данных в формате jsonb, затем попадая в кэш. При запросе ордера ненайденные в кэше ищутся в базе данных. Реализован gracefull shutdown для корректного заверщения работы сервиса.