요약: RPC 속도 제한은 애플리케이션이 주어진 시간 창 내에서 블록체인 노드에 보낼 수 있는 요청 수를 제한하는 메커니즘입니다. 제한을 초과하면, 해당 시간 창이 재설정될 때까지 후속 요청은 거부됩니다(일반적으로 HTTP 429 오류가 발생합니다). 속도 제한은 공유 인프라를 악용으로부터 보호하고 모든 사용자에게 공정한 접근을 보장하기 위해 존재합니다. 속도 제한을 이해하고 관리하는 것은 부하가 가해져도 중단되지 않는 안정적인 블록체인 애플리케이션을 구축하는 데 필수적입니다.
간단한 설명
시간당 100인분을 조리할 수 있는 식당 주방을 상상해 보세요. 50명의 손님이 각각 3가지 요리를 주문하면 주방은 처리 한계에 도달합니다. 만약 한 손님이 50가지 요리를 주문하려고 하면, 다른 모든 손님이 식사를 할 수 있도록 주방은 그 손님의 주문을 거절해야 합니다. 속도 제한도 이와 같은 원리로 작동합니다. 블록체인 노드는 처리 용량이 한정되어 있으며, 속도 제한을 통해 동일한 인프라를 사용하는 다른 모든 사용자의 피해를 입히지 않고도 단일 애플리케이션이 해당 용량을 독점하지 못하도록 보장합니다.
애플리케이션이 너무 짧은 시간 내에 과도한 수의 RPC 요청을 보내면, 노드는 요청한 데이터 대신 오류 메시지를 반환합니다. 대부분의 제공업체에서는 이 경우 HTTP 429 “Too Many Requests” 상태 코드가 반환되며, 허용된 요청 수, 시도한 요청 수, 재시도까지 기다려야 할 시간 등을 알려주는 JSON-RPC 오류 본문이 함께 제공되는 경우가 많습니다. 애플리케이션이 이러한 신호를 무시하고 계속 요청을 보내면, 제공업체는 해당 IP 또는 API 키를 일시적으로 차단하거나 완전히 차단할 수 있습니다.
요청 제한은 일반적으로 초당 요청 수(RPS), 분당 요청 수, 또는 이 둘의 조합으로 표시됩니다. 서비스 제공업체는 무료 티어에서 25 RPS, 성장 티어에서 300 RPS, 엔터프라이즈 티어에서 1,000 RPS 이상을 허용할 수 있습니다. 일부 제공업체는 메서드별 제한을 적용하기도 하는데, 이는 debug_traceTransaction이나 큰 블록 범위를 다루는 eth_getLogs와 같이 계산 부담이 큰 메서드의 개별 제한이 eth_blockNumber와 같은 가벼운 메서드보다 낮다는 것을 의미합니다.
레이트 제한이 존재하는 이유
요율 제한은 세 가지 주요 목적을 수행합니다. 첫째, 인프라의 안정성을 보호합니다. 블록체인 노드는 전체 블록체인의 데이터를 유지하고 EVM 호출 및 상태 조회와 같은 복잡한 작업을 실행하는 상태 유지형 시스템입니다. 제한 없이 쏟아지는 요청은 노드의 CPU, 메모리, 디스크 I/O 또는 네트워크 대역폭을 과부하시켜 모든 사용자의 성능을 저하시키거나 노드를 완전히 다운시킬 수 있습니다. 요율 제한은 단일 클라이언트가 연쇄적인 장애를 일으키는 것을 방지하는 회로 차단기 역할을 합니다.
둘째, 속도 제한은 공정한 자원 배분을 보장합니다. 공유 인프라(대부분의 개발자가 사용하는 방식)에서는 수백 개 또는 수천 개의 애플리케이션이 동일한 노드 풀을 공유합니다. 속도 제한이 없다면, 과도한 인덱싱 스크립트를 실행하거나 잘못 구성된 폴링 루프를 가진 단일 애플리케이션이 사용 가능한 용량의 대부분을 소모하여, 다른 애플리케이션이 필요한 자원을 확보하지 못하게 될 수 있습니다. 속도 제한은 모든 애플리케이션이 합리적인 몫을 확보할 수 있도록 보장하는 공정 사용 정책을 시행합니다.
셋째, 속도 제한은 악용으로부터 시스템을 보호하는 수단입니다. 의도적이든 우발적이든 서비스 거부(DoS) 공격은 수많은 애플리케이션이 의존하는 인프라를 마비시킬 수 있습니다. 속도 제한은 악의적인 공격자가 공개 엔드포인트를 공격 수단으로 악용하는 것을 막을 뿐만 아니라, 선의의 개발자가 통제 불능 상태에 빠진 스크립트로 인해 의도치 않게 노드에 분산 서비스 거부(DDoS) 공격을 가하는 것을 방지합니다.
속도 제한이 애플리케이션에 미치는 영향
애플리케이션이 요청 제한을 처리하도록 설계되지 않았다면, 실제 운영 환경에서 오류가 발생할 것입니다. 가장 흔한 오류 mode 는 블록체인을 너무 빈번하게 조회하는 폴링 루프입니다. 새로운 블록이 있는지 확인하기 위해 100ms마다 “eth_blockNumber”를 호출하는 애플리케이션은 해당 메서드만으로도 분당 600회의 요청을 보내게 됩니다. 여기에 잔액 확인, 로그 조회, 활성 사용자마다의 트랜잭션 상태 확인까지 더해지면, 아무리 넉넉한 요청 제한이라도 금방 초과해 버릴 수 있습니다.
WebSocket 구독 역시 사용량 제한을 유발할 수 있습니다. 초기 구독 요청은 단일 호출로 간주되지만, 서버에서 수신되는 각 메시지(새로운 블록 알림이나 보류 중인 거래 알림 등)는 일부 제공업체의 경우 사용량에 포함될 수 있습니다. 애플리케이션이 여러 계약에 걸쳐 고빈도 이벤트 streams 를 구독하는 경우, 수신 메시지 양이 급격히 증가할 수 있습니다.
속도 제한으로 인해 요청이 실패하면 연쇄 반응이 발생합니다. 앱이 요청한 데이터를 받지 못하면 요청을 재시도할 수 있으며, 이로 인해 부하가 더욱 증가합니다. 재시도에 지수적 백오프(exponential backoff)가 적용되지 않으면, 속도 제한을 받은 요청이 더 많은 요청을 생성하고, 이로 인해 속도 제한이 더욱 강화되는 악순환이 발생합니다. 이러한 패턴은 속도 제한 기간이 재설정될 때까지 애플리케이션을 RPC endpoint 에서 사실상 차단할 수 있습니다.
요율 한도 관리 전략
가장 효과적인 전략은 애플리케이션이 수행해야 하는 요청의 수를 줄이는 것입니다. 캐싱은 이 접근 방식의 핵심입니다. 앱에서 ETH 가격, 토큰 메타데이터 또는 기타 변화가 느린 데이터를 표시하는 경우, 페이지가 로드되거나 사용자가 작업을 수행할 때마다 노드에 쿼리를 보내는 대신 해당 결과를 로컬에 캐싱하고 적절한 간격으로 새로 고치도록 하십시오. 블록마다 변경되는 데이터의 경우, HTTP를 통한 폴링 대신 WebSocket을 통해 구독하십시오. 단 한 번의 구독으로 수천 건의 개별 폴링 요청을 대체할 수 있기 때문입니다.
요청을 일괄 처리하면 HTTP 오버헤드를 줄일 수 있으며, 요청 제한을 준수하는 데 도움이 됩니다. 10개의 서로 다른 지갑 잔액을 확인하기 위해 10번의 개별 호출을 보내는 대신, 이를 하나의 JSON-RPC 배열 요청으로 묶어 보내세요. 노드는 각 요청을 개별적으로 처리하지만, 사용자는 단 하나의 HTTP 요청만으로 모든 정보를 전송할 수 있습니다. 일부 제공업체는 HTTP 요청 자체뿐만 아니라 일괄 처리 내의 각 메서드 호출도 요청 제한에 포함시켜 계산한다는 점에 유의해야 합니다.
클라이언트 측 요청 제한을 구현하는 것은 방어적인 모범 사례입니다. 서버가 요청을 거부할 때까지 기다리기보다는, 발신 요청 빈도를 추적하고 미리 정해진 한도를 초과할 것으로 예상되는 요청을 대기열에 넣거나 지연시켜야 합니다. 이를 통해 애플리케이션을 사전에 허용 범위 내로 유지하고, 요청 거부로 인한 지연 시간을 방지할 수 있습니다. bottleneck(Node.js)이나 ratelimit(Python)과 같은 라이브러리를 사용하면 이를 간편하게 구현할 수 있습니다.
사용 환경에 적합한 인프라 티어를 선택하는 것이 궁극적으로 가장 신뢰할 수 있는 해결책입니다. 애플리케이션이 지속적으로 속도 제한에 걸린다면, 더 많은 최적화 기법이 아니라 더 큰 용량이 필요합니다. 더 높은 티어로 업그레이드하거나 전용 인프라로 전환하면 속도 제한 문제를 완전히 해소할 수 있습니다.
HTTP 429 오류는 무엇을 의미하나요?
HTTP 429 “Too Many Requests” 응답은 현재 시간 창 내에서 허용된 요청 빈도를 초과했음을 의미합니다. 노드에 문제가 있는 것이 아니며, 일반적으로 인증 정보에도 문제가 없습니다. 단순히 요금제에서 허용하는 것보다 더 빠른 속도로 요청을 보내고 있는 것뿐입니다. 해결 방법은 응답을 확인하는 것입니다. 응답에는 대개 대기 시간이 포함되어 있으므로, 해당 시간이 지난 후 지수적 백오프(exponential backoff)를 사용하여 재시도해야 합니다. 그래야 반복적인 실패로 인해 부하가 더 쌓이는 것을 방지할 수 있습니다. 429 오류가 지속적으로 발생한다면, 무작정 재시도하기보다는 요청량을 줄이거나 더 높은 용량의 티어로 전환해야 합니다. RPC 요청이 어떻게 작동하는지, 그리고 RPC endpoint 가 호출을 어떻게 처리하는지 이해하면, 왜 일부 메서드가 다른 메서드보다 더 빨리 제한에 도달하는지 쉽게 파악할 수 있습니다.
RPC 속도 제한에 걸리지 않으려면 어떻게 해야 할까요?
요율 제한을 피하는 방법은 주로 요청 횟수를 줄이고, 요청 비용을 낮추며, 요청 시점을 분산시키는 데 있습니다. 아래 표에는 가장 효과가 큰 기법들과 각 기법이 가장 적합한 시기가 요약되어 있습니다.
이 두 용어는 종종 혼용되지만, 과부하에 대한 서로 다른 대응 방식을 의미합니다. 속도 제한(Rate limiting)은 엄격한 상한선을 적용합니다. 이 한도를 초과하면 요청이 즉시 거부되며, 일반적으로 429 오류가 반환됩니다. 반면 스로틀링(Throttling)은 더 유연한 방식입니다. 요청을 거부하는 대신, 시스템이 요청 속도를 늦추거나 대기열에 넣어 요청이 더 느리게 처리되더라도 완료되도록 합니다. 두 방식 모두 공유 인프라를 보호하지만, 클라이언트 관점에서 볼 때 실패하는 방식은 서로 다릅니다.
양상
속도 제한
속도 제한
과잉에 대한 대응
요청을 거부합니다
요청이 느려지거나 대기열에 쌓입니다
전형적인 신호
HTTP 429 오류
지연 시간 증가
고객에 미치는 영향
실패한 호출 재시도
지연되었으나 완료된 통화
목표
사용량 상한을 엄격히 적용합니다
트래픽 급증 완화하기
두 가지 모두 애플리케이션 관점에서 RPC 지연 시간이 더 길어 보이는 원인이 될 수 있으며, 둘 다 인프라 전반의 처리량과 지연 시간 간의 상충 관계와 밀접한 관련이 있습니다.
자주 묻는 질문
적절한 RPC 속도 제한은 얼마인가요?
이는 작업 부하와 요금제에 따라 다릅니다. 무료 요금제의 경우 초당 약 25건의 요청을 허용하는 반면, 성장형 및 엔터프라이즈 요금제는 수백 건에서 수천 건에 달합니다. 적절한 한도는 캐싱, 배치 처리, 스트리밍을 적용한 후에도 피크 요청 처리량을 여유 있게 초과할 수 있는 수준입니다.
429 응답은 어떻게 처리해야 할까요?
endpoint 에 무작정 요청을 쏟아붓기보다는 백오프를 적용한 후 다시 시도하십시오. 지터가 포함된 지수적 백오프를 사용하고, 응답에 포함된 ‘재시도 대기 시간’ 지침을 준수하며, 재시도 횟수를 제한하십시오. 429 오류가 계속 발생한다면, 재시도 빈도를 더 높이는 대신 요청량을 줄이거나 용량을 확장하십시오.
일괄 요청은 하나의 요청으로 간주되나요?
항상 그런 것은 아닙니다. 일괄 처리는 단일 HTTP 요청으로 전송되지만, 많은 제공업체는 일괄 처리 내의 각 메서드 호출을 사용량 제한에 포함시켜 계산합니다. 일괄 처리는 여전히 네트워크 오버헤드를 줄여주지만, 사용량 제한이 적용되는 호출 횟수를 반드시 줄여주는 것은 아닙니다.
스트리밍을 하면 전송 속도 제한을 피할 수 있나요?
대체로 그렇습니다. 데이터 수집 측면에서 말이죠. 푸시 기반 스트림은 수천 번의 폴링 호출을 필요로 하지 않고, 새로운 블록체인 데이터가 생성되는 즉시 이를 전달하므로, 애초에 속도 제한을 유발하는 요청량의 대부분을 제거해 줍니다.
왜 일부 메서드에는 더 엄격한 속도 제한이 적용되나요?
트랜잭션 추적이나 대용량 로그 쿼리와 같이 계산 부하가 큰 메서드는 최신 블록 번호를 조회하는 것과 같은 경량 호출보다 훨씬 더 많은 노드 리소스를 소모합니다. 제공업체는 노드의 전반적인 안정성을 보호하기 위해 이러한 부하가 큰 호출에 대해 메서드별 더 엄격한 제한을 적용합니다.
Quicknode 의 요청 제한 처리 방식
Quicknode 개발자가 endpoint 의 사용량을 직접 관리할 수 있도록 유연한 속도 제한 제어 기능을 제공합니다. 요금제 수준의 RPS 제한 외에도, Quicknode 는 개별 RPC 메서드에 대한 정확한 제한을 설정할 수 있는 메서드 수준의 속도 제한 기능을 제공합니다. 이는 비용이 많이 드는 메서드를 과도하게 호출할 수 있는 제어 불능 상태의 스크립트나 타사 통합으로부터 endpoint 를 보호하는 데 특히 유용합니다. 대시보드 UI를 통해 또는 콘솔 API를 이용한 프로그래밍 방식으로, 메서드별로 초당, 분당 또는 일당 제한을 구성할 수 있습니다.
Quicknode 또한 개별 IP 주소에서 발생하는 총 요청 수를 제어하기 위한 IP 기반 요청 제한 기능을 제공하며, 이는 endpoint 이 요청량을 완전히 제어할 수 없는 클라이언트 측 애플리케이션에 노출된 경우에 유용합니다. Quicknode 대시보드의 실시간 분석 기능을 통해 메서드 호출량, 응답 상태 및 응답 시간을 확인할 수 있어, 사용 패턴을 종합적으로 파악함으로써 요청 제한 문제가 발생하기 전에 문제를 식별하고 해결할 수 있습니다.
속도 제한을 완전히 벗어나야 하는 팀의 경우, Quicknode Streams 요청-응답 패턴을 푸시 기반 데이터 전달 모델로 대체합니다. 애플리케이션이 분당 수천 번 노드를 폴링하는 대신, Streams 은 새로운 블록이 생성될 때마다 블록체인 데이터를 웹훅, 데이터베이스 또는 데이터 웨어하우스로 직접 푸시합니다. 이를 통해 데이터 수집 워크로드에서 RPC 속도 제한을 완전히 제거할 뿐만 아니라, 지연 시간을 줄이고 백엔드 아키텍처를 간소화할 수 있습니다.