Сервер, который занимается обходом 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).