작성
·
80
1
킬구형 안녕, Fault Tolerant 쪽에서,
retryLimit()을 설명해줄 때
만약 retryLimit 값이 3일경우, "첫번째 호출시도 1번, 재시도 호출 2번"으로 총 3번이 호출된다고 했잖아.
재시도 횟수는 항상 retryLimit - 1
이라 그랬고.
근데 왜 "ItemProcessor의 예외 발생 시 재시도 - 아이템 단위로 재시도 관리"의 마지막 호출 결과 찍어준 부분에서,
retryLimit()은 3인데 왜 ItemProcessor는 4번이 호출되는거야?
위에 설명한대로라면 3번만 호출되어야 하는거 아냐?
답변 2
1
KILL-9@/bin/destroy:~$ man retry-limit
좋은 질문이군, FWoody! 섬세하고 예리한 관찰력이다.
KILL-9@/bin/destroy:~$ grep -r "retryLimit=3" /system/batch
retryLimit이 3이라는 것은 "최대 3번까지 시도 허용"이라는 뜻이다. 실제 실행 시퀀스는 다음과 같다:
```bash
KILL-9@/bin/destroy:~$ ./itemprocessor --attempt=1 # FAILED
KILL-9@/bin/destroy:~$ ./itemprocessor --attempt=2 # FAILED
KILL-9@/bin/destroy:~$ ./itemprocessor --attempt=3 # FAILED
KILL-9@/bin/destroy:~$ ./itemprocessor --attempt=4 # BLOCKED BY RETRY_POLICY -> 이게 실행결과에 시도 횟수 4가 기록된 이유이다
```
ItemProcessor는 실제로 3번만 호출된다. 4번째는 RetryTemplate(SimpleRetryPolicy)에 의해 **호출 자체가 차단**되어 즉시 스텝이 폭파된다.
KILL-9@error:~$ echo "RETRY LIMIT EXCEEDED - TERMINATING PROCESS"
로그에서 "4번 호출"처럼 보이는 건 Spring Batch Step(정확히는 바로 다음 작전에서 보게될 반복 컴포넌트) 4번째 시도를 **하려고 했지만** retry limit 방어막에 막혀서 실제 호출은 일어나지 않고 바로 죽어버린 것이다.
KILL-9@/bin/destroy:~$ sleep 666 && verify --brutal-mode
현재 외부 지역이라 예제 실행 결과를 직접 확인할 수 없다. 45분 내에 복귀해서 강의 내용 확인사살하겠다. 💀
(물론 안 봐도 내 분석이 맞지만 말이다... 훗💀)
██████╗ ██████╗ ██╗ ██╗██████╗ ██╗ ███████╗ ████████╗ █████╗ ██████╗
██╔══██╗██╔═══██╗██║ ██║██╔══██╗██║ ██╔════╝ ╚══██╔══╝██╔══██╗██╔══██╗
██║ ██║██║ ██║██║ ██║██████╔╝██║ █████╗ ██║ ███████║██████╔╝
██║ ██║██║ ██║██║ ██║██╔══██╗██║ ██╔══╝ ██║ ██╔══██║██╔═══╝
██████╔╝╚██████╔╝╚██████╔╝██████╔╝███████╗███████╗ ██║ ██║ ██║██║
╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═╝
[BANG! BANG!]
💀 💀 💀
확인 사살을 마쳤다. 앞선 나의 대답이 옳다.
retryLimit=3일 때 ItemProcessor는 정확히 3번만 호출된다. 4번째 시도는 RetryPolicy에 의해 호출 자체가 차단되어 즉시 스텝이 실패로 처리된다.
KILL-9@/bin/destroy:~$ grep -r "허용 가능한 총 시도 횟수" /lecture/content
>> 우리 강의 retryLimit() 설명에서 **'허용 가능한 총 시도 횟수'**라고 표현한 이유이다. 실제로는 그 횟수만큼만 시도가 허용되고, 그 이상은 시스템이 거부하기 때문이다.
KILL-9@danger:~# echo "추가 보충 예정"
너와 같이 착각하는 병사들이 분명 더 생길 수 있으니, 늦어도 일요일 안으로 예제 실행 결과 설명을 보충하겠다.
KILL-9@/bin/destroy:~$ crontab -e
0 0 * * SUN /bin/update-lecture-content --section=retry-limit
-1
안녕하세요, 인프런 AI 인턴입니다.
FWoody님, FaultTolerant
의 retryLimit()
과 관련된 질문을 주셨네요. retryLimit()
은 설정된 값만큼의 호출을 포함하여, 최대 시도 회수를 지정하는 것입니다. 즉, retryLimit()
으로 설정한 횟수만큼 ‘전체 호출’이 일어나게 됩니다.
하지만, ItemProcessor
나 다른 컴포넌트의 실제 호출 횟수는 다르게 보일 수 있습니다. 여기에서 중요한 점은 각 시도에서 새로운 예외가 발생할 경우, 비정상 종료 이후 재시도가 진행되는 과정에서의 호출이 추가로 발생할 수 있다는 것입니다.
즉, ItemProcessor
에서 특정 조건으로 인해 예외가 발생하면 중간의 특정 프로세스가 다시 시도되는 과정에서의 추가 호출로 인해 결과적으로 4번 호출이 될 수 있습니다.
해당 사항에 대한 구체적인 프로세스는 로그나 추가 설정에 의해 달라질 수 있습니다. 따라서 실제 문제 해결 시, 사용 중인 설정과 로그를 바탕으로 구체적 확인을 추천드립니다.
이와 관련하여 더 알아보기 위해서는 다음 링크의 유사한 답변을 참고하실 수 있습니다:
- Fault Tolerant 및 retryLimit 관련 심층 분석
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.