vchuravy
(Valentin Churavy)
9월 12, 2023, 6:12오후
1
크롤러 스로틀링이 어떻게 구현되는지에 대해 일반적인 질문이 있습니다.
Reduce Google Crawl Rate | Google Crawling Infrastructure | Crawling infrastructure | Google for Developers 에 따르면, 권장되는 HTTP 상태 코드는 429(요청 횟수 초과) 또는 503(사이트 사용 불가)입니다.
하지만 소스 코드를 읽어보니, 스로틀링은 오류를 throw하는 방식으로 구현되어 있는 것으로 보입니다: discourse/lib/rate_limiter.rb at 85fddf58bc1e751d0ac5b8192a630c59a34aed7d · discourse/discourse · GitHub
Ruby on Rails를 사용하던 시절은 이미 오래되었지만, 이것이 일반적인 505 오류를 발생시키는 것이라고 추정합니다.
구글 크롤러는 discourse의 스로틀링을 제대로 이해하지 못하는 것 같으며, Google Search Console에서 스로틀링이 구현된 후 인덱싱 및 그에 따른 노출 수가 급격히 감소한 것을 확인할 수 있습니다. 이는 스로틀링 자체 때문이 아니라 5xx 서버 오류 때문인 것으로 보입니다.
너무 많은 트래픽을 유발할 경우 스로틀링 인스턴스가 때때로 필요할 수 있다는 점은 이해하지만, discourse가 크롤러에게 505 내부 오류를 반환하는 대신 HTTP 429를 보고하도록 기대했습니다.
Falco
(Falco)
9월 12, 2023, 6:15오후
2
찾고 계신 것은 아마도 이것일 것입니다.
rescue_from RateLimiter::LimitExceeded do |e|
retry_time_in_seconds = e&.available_in
response_headers = { "Retry-After": retry_time_in_seconds.to_s }
response_headers["Discourse-Rate-Limit-Error-Code"] = e.error_code if e&.error_code
with_resolved_locale do
render_json_error(
e.description,
type: :rate_limit,
status: 429,
extras: {
wait_seconds: retry_time_in_seconds,
time_left: e&.time_left,
},
headers: response_headers,
)
end
end
해당 에러에 대해 상태 코드를 설정하는 “글로벌” 컨트롤러 구조스입니다.
vchuravy
(Valentin Churavy)
9월 12, 2023, 6:21오후
3
감사합니다! 안심되긴 하지만, 스로틀링이 구현된 시점과 일치하는 5xx 에러를 Google Search Console이 보고하는 이유를 완전히 설명해 주지는 않네요.
심지어 discourse의 sitemap.xml을 가져오지 못했다고 보고하고 있습니다.
vchuravy
(Valentin Churavy)
9월 12, 2023, 6:34오후
4
특히 sitemap.xml에 대한 스로틀링이 문제인 것 같습니다.
이것이 커버리지 공백의 원인이었을 것으로 추측합니다. Google이 429 오류를 5xx 오류로 잘못 보고했을 수도 있다고 생각합니다.