애플리케이션 디자인

Spring WebClient를 사용하여 429 RateLimit 오류 관리

5 분 읽기

저는 최근에 관리 업무를 맡게 되었습니다. 스프링 부트 프로젝트입니다. 이 프로젝트에는 몇 가지 RateLimit 앱이 원격 REST API를 호출할 때 로그에 오류가 발생했습니다. 이 앱은 동기식 블로킹 방식을 사용하고 있었던 것으로 밝혀졌습니다. RestTemplate 새로운 Spring 대신 클라이언트가 API 호출을 수행합니다. 웹 클라이언트, 이는 Reactor API를 사용하고 있는 상황에서 발생합니다.

그리고 Reactor과 일반적인 Reactive API 사용의 가장 좋은 점은 무엇인지 아시나요? 데이터 스트림을 활용한 프로그래밍을 매우 쉽게 만들어줍니다. 또한 재시도 전략의 구현도 더욱 쉬워지게 합니다.

먼저 로그에 있는 오류에 대해 이야기해 보겠습니다. 제가 확인한 내용은 다음과 같습니다.

항상 그렇듯이 스택 추적의 흥미로운 부분은 맨 위에 있습니다. 오류는 429 요청이 너무 많음, 그리고 메시지는 '있다'라고 말합니다. 1분 속도 제한. 이를 분석하면 HTTP 상태는 반환된 코드는 429입니다.. 이는 속도 제한 오류입니다. 즉, API가 호출자에게 너무 많은 요청을 보냈다고 알려주는 것입니다. 일반적으로 이 문제는 잠시 기다리면 해결될 수 있으며, 심지어 요청을 다시 보내는 것도 가능합니다. 재시도 후 응답에 헤더가 표시되어 얼마나 기다려야 하는지 알려줍니다.

Spring의 WebClient를 통해 그 정보를 어떻게 얻을 수 있는지 살펴보겠습니다:

이 코드는 다음을 전송합니다. GET request. WebClient를 사용하면 요청의 응답을 살펴보고 적절히 반응할 수 있습니다. onStatus 방법. 첫 번째 매개변수는 반환된 HTTP 상태 코드를 기준으로 필터링하는 데 사용되는 논리자입니다. 여기서 상태 코드가 429인 경우 우리는 작업을 수행합니다.

우리는 그들을 살펴본다. 답변 헤더, 있는지 확인하세요 재시도 후 헤더, 그렇다면 우리는 delayInSeconds 변수와 함께 사용하면 그렇지 않으면 기본값인 60을 설정합니다. 그런 다음 다시 전송할 수 있습니다. 답변 몸을 매핑하여 RateLimitException. 본문 내용은 오류 메시지로 사용되며 delayInSeconds는 별도의 필드에 제공됩니다. 자세한 내용은 Exception 코드를 참고하세요:

그러므로 해야 할 일은 특정 오류를 잡고 주어진 기간 후에 다시 시도하는 것입니다. Reactor는 이를 쉽게 구현합니다. 재시도 전략. 당신이 해야 할 일은 전화하는 것뿐입니다. retryWhen 방법:

다양한 종류가 있습니다. 재시도 방법들, 여기에서는 이들을 사용할 수 있습니다. withThrowable() builder. 이 플럭스는 다음을 포함해야 합니다. RateLimitException. 따라서 이를 확인하기 위해 필터를 적용해 시작합니다. 그런 다음 해당 예외를 실제 Retry 객체에 매핑합니다. 여기서는 이 예외가 재시도. fixedDelay 전략은 최대 시도 수와 지속 시간을 파라미터로 설정합니다. 지속 시간은 다음에서 파생됩니다. RateLimitException 그것은 이전에 던져졌습니다.

그렇다면, 요청이 429를 반환할 때마다 클라이언트는 다시 시도할 때까지 적절한 시간을 기다립니다. 그리고 Reactor를 사용하는 것보다 이를 구현하는 것이 훨씬 더 쉬웠습니다. try/catch 봄의 RestTemplate. 반응형 프로그래밍은 처음에 조금 무서운 것 같지만, HTTP 요청과 응답 같은 데이터 스트림을 관리하거나, 반응형 프로그래밍을 지원하는 데이터베이스와의 연결을 관리하는 훌륭한 방법입니다. 카우치베이스.

더 많은 도움과 아이디어를 원하십니까?

이 기사 공유하기

작가

로랑은 파리에 사는 찌질한 매니아 기질이 있는 헤비메탈 마니아입니다. 그는 주로 자바(Java)로 코드를 작성하고 AsciiDoc으로 구조화된 텍스트를 작성하며, 데이터, 리액티브 프로그래밍 및 기타 유행어 같은 주제에 대해 자주 이야기합니다. 그는 또한 Clever Cloud와 Nuxeo의 전직 개발자 애드보케이트로 활동하며 해당 커뮤니티가 더 크고 강하게 성장하도록 시간과 전문 지식을 쏟아부었습니다. 현재는 카우치베이스(Couchbase)에서 개발자 관계(Developer Relations)를 총괄하고 있습니다.

댓글 남기기

데이터베이스의 확장성을 과거의 일로 남겨두세요

각 스택 추가마다 추가 비용이 발생하고 관리해야 할 항목도 더 많아집니다. 2분 안에 절약할 수 있는 금액을 추산해 보세요.