Skip to content

boichique/eleven-test-task

Repository files navigation

Тестовое задание для Клевентс Элевен Продакшн

Задание

Описание

Есть внешний сервис, который обрабатывает некие абстрактные объекты батчами. Данный сервис может обрабатывать только определенное количество элементов 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: Обрабатывает полученные элементы

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published