FactBuffer – это система на Go для буферизации и последовательной отправки данных ("фактов") на внешний API. Проект демонстрирует, как можно принять большое количество записей (до 1000 в минуту), аккумулировать их в памяти и затем отправлять по одной, соблюдая строгий порядок. Если запись находится в буфере более 5 минут, она считается устаревшей и отбрасывается.
- Буферизация данных: Прием большого объема входящих фактов и их хранение в памяти.
- Последовательная обработка: Факты отправляются на сервер строго по очереди.
- Защита от устаревания: Факты, находящиеся в буфере более 5 минут, отбрасываются.
- Обработка ошибок: Если при отправке возникает ошибка или сервер возвращает код, отличный от 200, факт пропускается.
- Логирование: Подробные логи для отслеживания каждого шага обработки.
Проект организован по стандартной схеме с разделением на слои:
myproject/
├── cmd/
│ └──main.go
│
├── internal/
│ └── factbuffer/
│ └── factbuffer.go
| └── factbuffer_test.go
├── Makefile
└── go.mod
- cmd/main.go – содержит функцию
main(), которая инициализирует буфер, генерирует тестовые факты и останавливает буфер после их обработки. - internal/factbuffer/factbuffer.go – содержит всю бизнес-логику: структуры
FactиFactBuffer, а также функцииNewFactBuffer(),AddFact(),startWorker()иStop(). - internal/factbuffer/factbuffer_test.go – содержит тесты, проверяющие, что факты корректно отправляются и что устаревшие факты не отправляются.
- Makefile – содержит цели для сборки, запуска, тестирования и очистки проекта.
-
Клонируйте репозиторий:
git clone https://github.com/fatkheev/queue_facts.git
-
Инициализируйте и скачайте зависимости:
go mod tidy -
Запустите программу:
make run
- Создаст буфер, рассчитанный на хранение до 5000 фактов (это примерно 5 минут при 1000 фактов в минуту).
- Сгенерирует 10 тестовых фактов.
- Добавит факты в буфер, где они будут храниться до отправки.
- Последовательно отправит каждый факт на API по адресу https://development.kpi-drive.ru/_api/facts/save_fact.
- Выведет в консоль подробные логи каждого шага обработки.
TestFactBuffer_Success: Проверяет, что все добавленные факты успешно отправляются на сервер.TestFactBuffer_Expired: Проверяет, что устаревшие факты (находящиеся в очереди более 5 минут) не отправляются.
Запустите тесты командой:
make test
build: Собирает проект и создаёт бинарный файл в папке bin.run: Собирает и запускает приложение.test: Запускает все тесты в проекте.clean: Удаляет сгенерированные файлы (папку bin).
make build
make run
make test
make clean
Чтобы проверить, что факты успешно сохранены на сервере, можно использовать Postman для отправки запроса к API получения фактов:
- Метод: POST
- URL: https://development.kpi-drive.ru/_api/indicators/get_facts
- Headers:
- Content-Type: application/x-www-form-urlencoded
- Authorization: Bearer
- Body (x-www-form-urlencoded):
- period_start=2024-12-01
- period_end=2024-12-31
- period_key=month
- indicator_to_mo_id=227373 После отправки запроса в Postman вы увидите список фактов, сохранённых на сервере.
- API Endpoint и Bearer Token: Текущие значения захардкожены в файле
internal/factbuffer/factbuffer.go(константы apiURL и bearerToken). При необходимости их можно изменить. - Размер буфера: Размер очереди установлен в cmd/main.go при создании буфера
NewFactBuffer(5000). Это значение можно настроить в зависимости от ожидаемой нагрузки.