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 모듈을 더 쉽게 사용할 수 있습니다 .

여러분도 꼭 사용해보세요

좋은 웹페이지 즐겨찾기