Timeout+Retry 조합 패턴 (Timeout+Retry Combination Pattern)
1. 개요
Timeout+Retry 조합 패턴은 재시도에 전체 시간 제한을 부여하거나, 각 개별 시도에 시간 제한을 부여하는 데코레이터 조합이다. 중첩 순서에 따라 의미론이 달라지며, 로봇 시스템에서 가장 빈번히 사용되는 데코레이터 조합 중 하나이다.
2. 패턴 1: 전체 시간 제한 + 재시도
Timeout이 외부에 배치되어, 모든 재시도를 포함한 전체 실행 시간을 제한한다.
<Timeout msec="60000">
<RetryNode num_attempts="5">
<Action ID="DownloadData"/>
</RetryNode>
</Timeout>
60초 이내에 최대 5회 재시도한다. 재시도 중이라도 60초가 경과하면 전체가 halt된다.
2.1 시간 분배
N회 시도에 전체 T 시간이 허용되므로, 각 시도에 평균 T/N의 시간이 할당된다. 실제로는 각 시도의 소요 시간이 다를 수 있으므로, 초반 시도가 오래 걸리면 후반 시도의 가용 시간이 줄어든다.
3. 패턴 2: 재시도 + 개별 시간 제한
Retry가 외부에 배치되어, 각 개별 시도에 시간 제한을 부여한다.
<RetryNode num_attempts="3">
<Timeout msec="10000">
<Action ID="ConnectToSensor"/>
</Timeout>
</RetryNode>
각 시도에 10초의 시간 제한이 적용된다. 한 번의 시도가 10초를 초과하면 해당 시도가 FAILURE로 처리되고, 다음 시도가 시작된다. 최대 총 소요 시간은 3 \times 10 = 30초이다.
4. 두 패턴의 비교
| 특성 | 패턴 1 (Timeout 외부) | 패턴 2 (Retry 외부) |
|---|---|---|
| 시간 제한 범위 | 전체 재시도 과정 | 각 개별 시도 |
| 최대 소요 시간 | T (고정) | N \times T_{\text{per}} |
| 시도 간 시간 분배 | 불균등 가능 | 균등 |
| 적합한 상황 | 전체 시간 예산 제한 | 각 시도의 응답 시간 보장 |
5. 복합 패턴: 전체 시간 제한 + 개별 시간 제한 + 재시도
<Timeout msec="120000">
<RetryNode num_attempts="10">
<Timeout msec="15000">
<Action ID="AttemptConnection"/>
</Timeout>
</RetryNode>
</Timeout>
전체 2분 이내에서, 각 시도에 15초 제한으로 최대 10회 재시도한다.
6. 재시도 간 지연 포함
<Timeout msec="60000">
<RetryNode num_attempts="5">
<Delay delay_msec="2000">
<Action ID="ConnectToServer"/>
</Delay>
</RetryNode>
</Timeout>
각 재시도 사이에 2초 간격을 두며, 전체 60초 이내에서 5회 재시도한다.
7. 설계 시 고려 사항
7.1 Timeout 값과 Retry 횟수의 일관성
전체 Timeout이 개별 시도 소요 시간 × 재시도 횟수보다 짧으면, 일부 재시도가 실행되지 못한다. 두 값의 관계를 사전에 검증하여야 한다.
7.2 패턴 선택 기준
전체 응답 시간이 중요하면 패턴 1(Timeout 외부)을, 각 시도의 공정한 시간 할당이 중요하면 패턴 2(Retry 외부)를 선택한다.
8. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |