Есть внешний сервис, который обрабатывает некие абстрактные объекты батчами. Данный сервис может обрабатывать только определенное количество элементов n в заданный временной интервал p. При превышении ограничения, сервис блокирует последующую обработку на долгое время.
Задача заключается в реализации клиента к данному внешнему сервису и реализацию API для взаимодействия с клиентом, который позволит обрабатывать максимально возможное количество объектов без блокировки. Приводить реализацию внешнего сервиса необязательно!
Определение сервиса можно выразить как:
package main
import (
"context"
"errors"
"time"
)
// ErrBlocked reports if service is blocked.
var ErrBlocked = errors.New("blocked")
// Service defines external service that can process batches of items.
type Service interface {
GetLimits() (n uint64, p time.Duration)
Process(ctx context.Context, batch Batch) error
}
// Batch is a batch of items.
type Batch []Item
// Item is some abstract item.
type Item struct{}
- решение должно быть в git-репозитории (можно прислать архив или опубликовать на github, gitlab, bitbucket...)
- документирование кода
- тесты
- использование статического анализатора (конфигурацию положить в репозиторий)
Чтобы начать работу с этим кодом, выполните следующие шаги.
- Установленный Golang на вашем компьютере
- Установленный Docker на вашем компьютере
- Склонируйте этот репозиторий
- Перейдите в каталог с кодом
- Соберите клиентский бинарный файл и запустите сервер с помощью Docker Compose, выполнив следующую команду:
make run-service
Для запуска сервиса выполните следующую команду:
make run-service
Это соберет клиентский бинарный файл и запустит сервер с помощью Docker Compose
Для остановки сервиса выполните следующую команду:
make stop-service
Это остановит работающие контейнеры и удалит клиентский бинарный файл
Клиентская часть получает ограничения с сервера с помощью функции GetLimits(). Клиент использует rate limiter для контроля скорости отправки запросов на сервер. Он выполняет бесконечный цикл, ожидая разрешения rate limiter, и затем вызывает функцию ProcessItems() для отправки максимально возможного количества элементов на сервер для обработки.
Серверная часть предоставляет две REST-конечные точки:
- GET /api/items/limits: Выдает ограничения для обработки элементов
- POST /api/items/process: Обрабатывает полученные элементы