AWS Go SDK를 사용하다가 보니 각 서비스별 waiters가 있어 내부는 어떻게 동작하나 궁금해서 확인해본적이 있다.
waiter들은 내부적으로 15초 간격으로 최대 120번 요청을 해서 완료나 실패가 될 때까지 기다리는데, 개발하다보니 30분 이상으로 대기해야할 때가 있어서 커스텀해서 사용하려고 내부를 보니 위에서 말한 retry와는 다르지만 지속적으로 요청을 하기 떄문에 어떤 시간 간격으로 보내는지 확인해봤다.
func(wWaiter)WaitWithContext(ctxaws.Context)error{forattempt:=1;;attempt++{req,err:=w.NewRequest(w.RequestOptions)iferr!=nil{waiterLogf(w.Logger,"unable to create request %v",err)returnerr}req.Handlers.Build.PushBack(MakeAddToUserAgentFreeFormHandler("Waiter"))err=req.Send()// See if any of the acceptors match the request's response, or error
for_,a:=rangew.Acceptors{ifmatched,matchErr:=a.match(w.Name,w.Logger,req,err);matched{returnmatchErr}}// The Waiter should only check the resource state MaxAttempts times
// This is here instead of in the for loop above to prevent delaying
// unnecessary when the waiter will not retry.
ifattempt==w.MaxAttempts{break}// Delay to wait before inspecting the resource again
delay:=w.Delay(attempt)ifsleepFn:=req.Config.SleepDelay;sleepFn!=nil{// Support SleepDelay for backwards compatibility and testing
sleepFn(delay)}else{sleepCtxFn:=w.SleepWithContextifsleepCtxFn==nil{sleepCtxFn=aws.SleepWithContext}iferr:=sleepCtxFn(ctx,delay);err!=nil{returnawserr.New(CanceledErrorCode,"waiter context canceled",err)}}}returnawserr.New(WaiterResourceNotReadyErrorCode,"exceeded wait attempts",nil)}
코드를 보면 attempt에 따라 Delay를 걸고 재 요청하는 것으로 확인했다.
굳이 위의 retry pattern으로 따지자면 Incremental interval 쪽으로 속하려나..