봇에서 속도 제한 오류가 발생하더라도, 걱정하지 마세요. 이는 올바르게 접근한다면 해결될 수 있는 일상적인 문제입니다. 이 문서를 통해, Discord의 속도 제한 시스템을 이해하고 유용한 해결책을 확인하는 데 도움을 받을 수 있습니다.
목차
Discord의 속도 제한 유형 이해하기
Discord는 API를 보호하기 위해 여러 종류의 속도 제한을 사용합니다. 올바른 해결책을 찾으려면 어떤 유형의 문제가 발생했는지 파악하는 것이 중요합니다:
전체 속도 제한
제한: 대부분의 엔드포인트에서 초당 50개의 요청
범위: 전체 애플리케이션에 적용
식별: 응답 헤더에서 X-RateLimit-Scope: global
찾기
경로별 속도 제한
제한: 엔드포인트마다 다름
범위: 개별 API 경로에 특정
식별: X-RateLimit-Scope: user
찾기
리소스별 속도 제한
참고: 리소스별 속도 제한은 여러 이유(다른 사용자, 봇, 웹후크 등)에 의해 발생할 수 있으며, 애플리케이션이 유일한 이유가 아닐 수 있습니다.
제한: 특정 길드, 채널 또는 웹훅에 대한 독립적인 제한
범위: 특정 리소스에 대한 작업에 적용
식별: 헤더에서 X-RateLimit-Scope: shared
찾기
잘못된 요청 제한
제한: 10분마다 10,000개의 잘못된 요청
일반적인 원인: 처리되지 않은 오류(401, 403 또는 429)로 인한 요청 급증. X-RateLimit-Scope: shared
와 함께 반환된 429 오류는 잘못된 요청 제한에 포함되지 않습니다.
결과: 임시 Cloudflare 차단
본인의 속도 제한 문제를 파악하는 방법
어떤 제한에 걸렸는지 확인하는 가장 믿을 수 있는 방법은 429 상태 코드를 받을 때 HTTP 응답 헤더를 확인하는 것입니다. 확인해야 할 중요 헤더는 다음과 같습니다:
X-RateLimit-Limit
: 해당 엔드포인트의 속도 제한 상한선
X-RateLimit-Remaining
: 현재 창에 남아있는 요청 수
X-RateLimit-Reset
: 속도 제한 창이 초기화될 때 (유닉스 타임스탬프)
X-RateLimit-Reset-After
: 제한이 초기화될 때까지의 시간(초)
X-RateLimit-Scope
: 속도 제한의 유형 (전체, 사용자 또는 공유)
retry_after
: 다른 요청을 시도하기 전에 대기해야 할 시간(밀리초)
속도 제한 문제를 처리할 때 권장 사항
적절한 백오프 방법 실행하기
속도 제한 응답의 retry_after
값을 항상 준수해 주세요. 재시도하기 전에 정확히 얼마나 기다려야 하는지 알려줍니다.
가능하다면 상호작용 사용 고려하기
애플리케이션 명령과 메시지 구성 요소는 접두사 명령 대신 사용할 수 있는 좋은 대안이며, 채널에서 과도한 API 요청 및 메시지를 방지할 수 있습니다.
추가 팁: 상호작용 응답 및 후속 메시지를 일시적으로 설정하세요. 이들은 속도 제한에 포함되지 않습니다.
효율적인 데이터 캐시
자주 사용하는 데이터를 캐싱하여 API 호출을 줄입니다. 예를 들어:
- 길드 정보
- 채널 세부정보
- 사용자 프로필
- 역할 데이터
요청 스로틀링 사용하기
스로틀링은 제한에 도달하기 전에 요청 속도를 제어하여 속도 제한을 방지하는 사전 대응 방식입니다.
예를 들어, 봇이 200명의 신규 회원에게 환영 메시지를 보내야 하는 경우, 200개의 메시지를 모두 즉시 보내는 대신 100밀리초마다 4개의 요청을 보내는 대기열에 배치할 수 있습니다. 이렇게 하면 초당 40건의 요청을 안정적으로 유지하여, 50건의 요청 제한을 안전하게 유지하면서 모든 메시지를 약 5초 내에 전송할 수 있습니다.
전체 속도 제한
전체 속도 제한에 도달하는 경우, 고객님의 프로그램 내에 해결해야 할 근본적인 문제가 있을 수 있습니다.
코드를 최적화하여 한도 내에서 유지하는 방법은 다음과 같습니다:
- 적절한 캐싱 실행
- 상호작용 기반 기능으로 마이그레이션하기
이러한 방법으로도 전체 속도 제한 문제가 해결되지 않는다면, Discord 개발자 서버 #api-help
채널이나 개발자 지원으로 문의해 주시기 바랍니다.
게이트웨이 고려사항 및 샤딩
Discord의 게이트웨이(웹 소켓 연결)를 통해 실시간 이벤트를 처리하는 봇의 경우, 봇이 성장함에 따라 샤딩이 필수적입니다.
샤딩이란 무엇인가요?
샤딩은 봇을 여러 인스턴스로 분할하여 각 인스턴스가 길드의 하위 집합을 처리하게 하는 것을 말합니다. 이를 통해, 여러 웹 소켓 연결에 부하가 분산되며 속도 제한을 준수하는데 도움이 될 수 있습니다.
2,000개의 길드에 다다랐을 때 샤딩 실행 계획을 시작하는 것이 좋습니다. 샤딩은 2,500개 이상의 길드에서는 반드시 활성화되어야 합니다. 최적의 성능을 위해, 길드 1,000개당 샤드 1개 정도를 유지하는 것을 권해드립니다.
모든 Discord 사용자에게 안정적인 환경을 제공하기 위해 속도 제한이 존재한다는 것을 기억해 주세요. 이러한 권장 사항을 따름으로서, 속도 제한을 준수하면서 효과적으로 성장하는 봇을 구축할 수 있습니다.