Skip to content

Latest commit

 

History

History
79 lines (61 loc) · 2.08 KB

File metadata and controls

79 lines (61 loc) · 2.08 KB

Network crawler

Описание

Сервер, который занимается обходом URL'ов

type Crawler interface {
	ListenAndServe(ctx context.Context, address string) error
}

type CrawlRequest struct {
	URLs      []string `json:"urls"`
	Workers   int      `json:"workers"`    // количество воркеров
	TimeoutMS int      `json:"timeout_ms"` // таймаут на обработку всех урлов
}

type CrawlResponse struct {
	URL        string `json:"url"`
	StatusCode int    `json:"status_code,omitempty"`
	Error      string `json:"error,omitempty"`
}

Отправляя POST запрос на /crawl сервер должен многопоточно обойти URLs и вернуть коды ответов:

func main() {
	ctx := context.Background()

	c := crawler.New()
	c.ListenAndServe(ctx, ":8080")

}

Request:

curl --location 'http://127.0.0.1:8080/crawl' \
--header 'Content-Type: application/json' \
--data '{
    "urls": [
        "https://google.com",
        "https://dzen.ru"
    ],
    "workers": 2,
    "timeout_ms": 2000
}
'

Response:

[
    {
        "url": "https://google.com",
        "status_code": 200
    },
    {
        "url": "https://dzen.ru",
        "status_code": 200
    }
]
  • В ответе для урла либо ошибка error, либо status_code

  • Порядок результатов должен совпадать с входным

Задание

Реализация поддерживает:

  • Кэширование ответов c (ttl = 1 секунда).
  • Нормализацию URL'ов.
  • Graceful shutdown - при отмене контекста сервер должен вызвать Shutdown и корректно дождаться завершения текущих запросов (до 10 секунд).
  • Кэширование для параллельных запросов (singleflight).