Exponential Backoff 란 무엇인가 호이? 확장해 보았습니다.
0. 소개
이번 기사는 Ruby 2.5.7에서 동작 확인하고 있습니다 😗
1. 마지막 모듈을 rescue ~ retry로 사용해 보자.
이전 기사Exponential Backoff 란 무엇인가 호이? Enumerator 클래스로 작성해 보았습니다.의 코멘트란에서, 「리트라이 처리는
rescue 〜 retry
를 사용하는 경우가 많다」라고 하는 의견을 받았으므로, 전회 만든 ExponentialBackoff
모듈을, rescue 〜 retry
의 패턴에 짜넣는 것 생각하고 싶습니다.우선 임베디드 예는 다음과 같은 느낌이 듭니다.
def request_with_retry
request # リクエスト失敗時は例外エラーが発生
rescue => exception
eb ||= ExponentialBackoff.call(max_attempt: 5) # 5回分の値を返す Enumerator オブジェクトを生成
backoff = eb.next rescue nil # 次の値が取得できずに例外が発生した場合は、rescue して nil を代入
sleep backoff and retry if backoff # 次の値が取得できていれば、その値秒だけ sleep して retry
end
다섯 번째 줄의
eb.next
에서 다음 값을 검색 할 때 max_attempt
에 도달하면 StopIteration
오류가 발생하지만 뒤에있는 rescue
에서 캡처하여 nil을 반환합니다. . 예외 오류가 발생하여 재시도 흐름이 제어되고 매우 미묘합니다 그래서 재시도 상한에 도달했는지 여부를 판정할 수 있는 메소드를 추가하기로 했습니다.
2. #peek? 메소드를 추가하자.
추가하는 메소드는, 반환되는 Enumerator 객체를 확장하는 형태로 구현하기로 합니다.
다음과 같이 재시도 상한에 도달했는지 어떨지를 boolean 로 돌려주는,
#peek?
메소드를 갖춘 PeekQues
모듈을 준비했습니다.module PeekQues
def peek?
peek
true
rescue StopIteration
false
end
end
그런 다음
ExponentialBackoff.call
가 Enumerator 객체를 반환하면 위의 PeekQues
모듈을 확장합니다.module ExponentialBackoff
def self.call(max_attempt: Float::INFINITY, capacity: Float::INFINITY, base: 1)
Enumerator
.new(max_attempt) { |yielder|
(1..max_attempt) { |attempt|
yielder << [capacity, base * 2 ** attempt].min
}
}
.extend(PeekQues) # 返却するオブジェクトに #peek? メソッドを追加
end
end
3. 추가한 #peek? 메소드를 사용해 보자
이제 추가한
#peek?
메서드를 사용하여 시작 부분의 재시도 처리를 개선해 보겠습니다.이런 느낌이 듭니다.
def request_with_retry
request # リクエスト失敗時は例外エラーが発生
rescue => exception
eb ||= ExponentialBackoff.call(max_attempt: 5) # 5回分の値を返す Enumerator オブジェクトを生成
sleep eb.next and retry if eb.peek? # 次の値が取得できるなら、その値秒だけ sleep して retry
end
후치의
rescue
가 사라져서 좋은 느낌이 들었습니다 4. 결론
이제 재시도 제어 흐름에 rescue를 사용할 필요가 없으며
ExponentialBackoff
모듈을 더 쉽게 사용할 수 있습니다 .여러분도 꼭 사용해보세요
Reference
이 문제에 관하여(Exponential Backoff 란 무엇인가 호이? 확장해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/m-kubo/items/325324f2886415ac5cda텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)