- Склонировать репозиторий:
git clone https://github.com/sertraline/messaggio - Для persisted storage нужно создать директории которые будут спроксированы в докер, иначе данные будут утеряны после остановки контейнера.
mkdir -p volumes/psql-writemkdir -p volumes/pgadmin
- Контейнеру нужны права на запись/чтение данных в директорию, postgres использует UID 1001, pgadmin использует 5050.
chown -R 1001:1001 volumes/chown -R 5050:5050 volumes/pgadmin
cp .env.example .env-> заполнить переменные в .env или оставить как есть- Можно запустить контейнеры через
docker compose up -d. - Теперь нужно создать топик в kafka.
- Зайдем в шелл контейнера:
docker exec -it messaggio.kafka /bin/bash - Создадим топик:
kafka-topics --create --topic messages --zookeeper messaggio.zookeeper:2181 --partitions 2 --replication-factor 1
- Запустить проект:
go run .
Проект придерживается структуры routes -> controllers -> services.
- main - определяет роуты и эндпоинты
- controllers - отвечает за логику эндпоинтов
- services - содержит бизнес-логику эндпоинтов
- validators - валидация входящих запросов и данных в POST формах
- errors - ошибки используемые в проекте
- database - содержит конфигурацию sqlx и kafka-go
- database/models - сериализация/десериализация данных из постгреса
Для запросов к API я использую утилиту curl.
Модель Messages:
Id int `json:"id"`
Content string `json:"content"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
Processed bool `json:"processed"`
- Создать сообщение
curl -X "POST" http://localhost:3333/messages -d '{"content": "123"}'Сообщение будет сохранено в базе данных постгреса и отправлено в topic 'messages' кафки с флагом processed=true. Если отправка в кафку не удалась, сообщение будет помечено processed=false.
Для ключей в kafka я использую генератор UUID.
Метод возвращает int64 который соответствует ID новой записи внесенной в базу данных.
- Получить сообщение из БД по ID:
curl http://localhost:3333/messages/1Если сообщение не найдено, будет возвращен статус {"status":"Resource not found."}.
- Получить статистику сообщений:
curl http://localhost:3333/stats Будет возвращен JSON объект вида {"Всего сообщений":8,"Обработано сообщений":2}.
- Прочитать сообщение из kafka:
curl http://localhost:3333/kafka/readПри наличии сообщения в очереди, будет возвращен объект вида:
{"key":"d09995bd-f77f-420e-b3ef-6f5b7eef9fac","offset":2,"partition":0 "topic":"messages","value":"123"}.
Если сообщения нет, метод будет блокировать выдачу ответа до таймаута или появления сообщения в очереди.