AWS Lambda에 대한 지수 백오프

3889 단어 serverlessawsjava
최근에 SQS 대기열에서 데이터를 읽는 Lambda 함수를 설정했습니다.
마이크로서비스 중 하나에 API 호출을 합니다.
당연히 이것은 마이크로 서비스가
다운되거나 응답하지 않을 수 있습니다.

AWS Lambda는 Lambda가 대기열에서 메시지를 선택하는 자체 재시도 메커니즘을 제공합니다.
가시성 시간 초과라고 하는 특정 기간 동안 다른 소비자에게 보이지 않게 됩니다.
소비자가 실행을 성공적으로 완료하면 대기열에서 메시지가 자동으로 삭제됩니다.
실행에 실패한 경우(예: 런타임 예외), 대략적인 수신 횟수
메시지의 양이 증가하고 가시성 제한 시간이 지나면 다른 소비자가 사용할 수 있게 됩니다.
대기열에서 메시지를 다시 읽을 수 있는 횟수
DLQ(Dead Letter Queue)로 최종 전송되기 전에
SQS 대기열은 대략적인 수신 횟수를 통해 추적됩니다.

이 재시도 메커니즘은 내가 사용 사례에서 염두에 두었던 것과 정확히 일치하지 않았습니다. 나는 함께 생각하고 있었다
기하급수적으로 증가하는 대기 시간으로 API 호출을 계속 재시도하는 백오프 전략 라인;
최종적으로 재시도 횟수를 설정한 후 메시지를 DLQ로 보냅니다. 이것은 우리에게 충분한 시간을 줄 것입니다
miscroservice의 모든 문제를 수정하고 API 호출 실패로 인한 폭격을 방지하십시오.

이것이 내가 끝난 것입니다.

첫째, 기하급수적 대기 시간을 계산하는 매우 기본적인 Java 함수입니다.
recvCount 재시도:

        int randomInt = rand.nextInt(60);
        Long result = new Double(Math.pow(2, recvCount)).longValue() + 30 +randomInt;  //adding jitter to new random visibility timeout


randomInt의 추가에 주목하십시오. 그것이 바로 '지터'입니다. 약간의 임의성. 나는 그것에 대해 읽었습니다.
documentation Google Cloud에서 제공하고 포함
좋은 습관으로.

다음으로 메시지의 가시성 제한 시간을 위에서 계산한 값으로 설정합니다. AWS에서 허용하는 최대값은 43200초입니다.
또는 12시간.

  sqs.changeMessageVisibility(queueUrl, msg.getReceiptHandle(), newVisibilityTimeout.intValue());


마지막으로 API 호출에 대한 응답을 확인합니다. 400 또는 500 시리즈 응답인 경우 런타임 예외를 throw하고 가시성 제한 시간을 변경합니다.
메시지. 이것은
Lambda 함수 실행 실패를 알리는 가장 쉬운 방법입니다. 또한 확인되지 않은 예외만 throw할 수 있습니다.
핸들러 메서드에서.

...
// api call
...  
 if (response.getStatusLine().getStatusCode() >= 400){
                            new ExponentialBackoff().setVisibilityTimeout(msg);
                            throw new RuntimeException("Request to server failed");
                        }


ExponentialBackoff는 가시성 제한 시간을 계산하고 설정하는 코드가 있는 유틸리티 클래스입니다. 그것은 또한 몇 가지 다른
이 데모에 필수적이지 않은 유틸리티 기능.

당신은 그것을 가지고 있습니다; AWS Lambda에 대한 베어 본 지수 백오프 구현입니다.

좋은 웹페이지 즐겨찾기