작성
·
94
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 관련 심층 분석
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.