Repository navigation
Worker emit·request에 최대 재시도 횟수와 대기 간격 옵션 추가 - #61
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
🟡 Changes recommended
The interval validation and retry delay handling still allow extremely large finite values to raise OverflowError, bypassing the documented contract and preventing the intended retry or broker-error behavior.
2 open issues
What changed in this PR
Adds configurable retry behavior to the Worker-level emit() and request() APIs while preserving existing broker contracts, payloads, priorities, timeouts, and exception propagation.
Changes:
- Added
retryandintervaloptions with validation and broker-call retry handling. - Added focused tests for retry counts, delays, successful recovery, exception propagation, and argument forwarding.
- Updated Korean and English manuals, changelog, and issue implementation records.
- Documented the possibility of duplicate execution when retries are used.
| File | Summary |
|---|---|
tests/test_task_messages.py |
Adds focused coverage for retry behavior, delays, validation, exception propagation, priority, and timeout forwarding. |
src/Worker/Message.py |
Implements retry validation and broker-call retry loops for emit() and request(). Two moderate findings remain regarding oversized interval validation and time.sleep() overflow handling. |
issues/feature/55/tasks/1793715537355.md |
Records the public argument-name change; contains one nit regarding the accuracy of a repository search result. |
issues/feature/55/tasks/1793714914194.md |
Records focused testing and documentation verification. |
issues/feature/55/tasks/1793705387888.md |
Records the initial requirements analysis and verification plan. |
issues/feature/55/TASKS.md |
Summarizes completed work, testing, and integration-test limitations. |
issues/feature/55/REQUIREMENTS.md |
Defines the retry API contract, validation rules, and acceptance criteria. |
issues/feature/55/README.md |
Records the feature scope and acceptance criteria; contains one nit because the documented argument names are not yet stated as finalized. |
issues/feature/55/PLAN.md |
Describes the implementation, testing, and documentation plan. |
issues/feature/55/implements/1793714914193.md |
Records implementation details and focused verification results. |
issues/feature/55/IMPLEMENTS.md |
Summarizes the implementation, tests, and known integration-validation limitations. |
issues/feature/55/CHANGELOG.md |
Documents the retry options and duplicate-execution warning. |
docs/Tasks.md |
Documents the retry API and operational behavior in Korean. |
docs/Tasks.en.md |
Documents the retry API and operational behavior in English. |
Review effort: Lite
Updated regression test results and verified compatibility of function signatures. Revised documentation in Korean and English, including the changelog. Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


변경 내용
원본 이슈: #55
README.md
Worker emit·request에 최대 재시도 횟수와 대기 간격 옵션 추가
이슈와 작업 상태
feature), 원본 이슈에 적용됨yong5eon/DefStream, 작업 브랜치feature/55master의3ce6044작업 문서
이슈 원문
해결하려는 문제
Worker에서 제공하는
emit과request는 현재 브로커 호출이 실패하면 즉시 예외를 전파한다. 일시적인 실패에 대응하려면 호출자가 각 호출부에서 재시도 로직을 직접 작성해야 한다.제안하는 해결 방법
src/Worker/Message.py의emit과request에 재시도 횟수와 시도 간 대기 간격을 지정하는 선택 인자를 추가한다. 브로커 구현체가 아닌 Worker 함수 계층에서 처리한다.옵션과 기본값
None1초인자명은 구현 시 기존 API 명명 관례에 맞춰 확정한다.
동작
None이면 기존과 동일하게 한 번만 호출하고, 실패 시 대기 없이 해당 예외를 즉시 전파한다.0이면 추가 시도 없이 최초 호출 결과만 반환하거나 예외를 전파한다.N이면 최초 호출 이후 최대N번 추가로 시도한다. 예를 들어3이면 최초 호출을 포함하여 최대4번 호출한다.raise한다. 마지막 실패 뒤에는 대기하지 않는다.emit과request에 동일한 재시도 정책을 적용한다. 기존 인자와 브로커 호출의 반환값·예외 계약은 유지한다.request의 기존timeout은 각 브로커 요청 호출에 그대로 전달한다. 전체 재시도 과정의 총 제한 시간으로 바꾸지 않는다.구현 범위
emit·request에서 브로커 호출 실패에 대한 재시도를 제공한다.고려한 대안
인수 기준
emit과request모두 최대 재시도 횟수와 대기 간격을 지정할 수 있으며, 기본값은 각각None과1초이다.None또는0이면 한 번만 호출하고 실패 예외를 즉시 전파한다.3에서 계속 실패하면 총4회 호출하고 대기는3회만 수행한다.priority전달과request의timeout전달을 유지한다.추가 정보
기존 동작을 바꾸는 것이 아니라 선택적으로 사용할 수 있는 공개 기능을 추가하므로
feature로 분류한다.재시도는 중복 전송이나 중복 실행 방지를 보장하지 않는다. 전송 이후 응답 대기 중 실패하는 등의 경우에는 이미 처리된 요청이 다시 전송될 수 있음을 사용 문서에 안내한다. 이 이슈에서 별도의 중복 방지 기능은 추가하지 않는다.
원문
REQUIREMENTS.md
Worker 메시지 발행·요청 재시도 요구사항
목적
Worker의
emit()과request()에 선택적 재시도를 추가하여 브로커 호출 실패를 설정된 횟수까지 다시 시도합니다. 이슈 원문과 작업 브랜치 정보는 이슈 기록을 기준으로 합니다. 이 문서는 요청 내용과 현재 구현을 대조한 분석 및 목표 동작을 정의하며, 구현·검증 결과는 아직 포함하지 않습니다.분석과 근거
이슈에서 요청한 결과
emit()과request()에서 최대 재시도 횟수와 시도 간 대기 시간을 선택적으로 지정합니다.None으로, 재시도하지 않고 기존처럼 한 번만 호출합니다. 기본 대기 간격은 1초입니다.request()의timeout,priority전달과 Worker 계층에서 재시도를 제공한다는 범위를 유지합니다.현재 코드와 요구사항의 차이
emit()은 작업·본문·브로커 기능·우선순위를 확인한 뒤broker.emit()을 한 번 호출합니다.request()도 같은 순서로 입력을 확인한 뒤broker.request()를 한 번 호출하고, 매번 기존timeout을 전달합니다.NotImplementedError를 재시도 대상으로 만들 필요는 없습니다.request()를 지원하지 않는 연결은Requestable검사에서 브로커 I/O 전에 거부됩니다. Redis 연결은 현재Requestable을 구현하지 않습니다.RemoteError로 던집니다. 사용자는 재시도 범위에 브로커 호출에서 발생하는 모든 예외를 포함하도록 확정했습니다. 따라서RemoteError도 재시도되며, 실패한 원격 작업이 다시 실행될 수 있습니다.확정 요구사항
emit()과request()에retry와interval키워드 인자를 제공해야 합니다. 기본값은 각각None과 1초입니다.None또는0회 재시도는 최초 호출만 수행합니다.N회 재시도는 최초 호출 후 최대N회 추가 호출까지 허용합니다.emit()또는request()호출이 예외를 던지면 재시도 정책을 적용합니다. 사용자가 확정한 범위에는RemoteError를 포함한 브로커 호출의 모든 일반 예외가 포함됩니다. 입력·작업 검증 및 기능 지원 확인 단계에서 발생하는 오류는 재시도하지 않습니다.request()의 기존timeout은 각 재시도 호출에 동일하게 전달합니다. 재시도 전체 시간에 대한 별도 총 timeout은 추가하지 않습니다. 기존priority, 본문과 작업 매개변수 전달도 유지합니다.DefStream.Worker의emit()·request()에만 적용합니다. 브로커 Protocol·구현체에는 재시도 설정이나 중복 재시도를 추가하지 않습니다.emit()/request()호출 재시도와 소비 중 메시지 오류·재전달 정책을 구분하고, 이미 처리된 발행·요청이 다시 전송될 수 있음을 안내합니다.구체화한 구현 계약
retry는None또는bool이 아닌 0 이상의 정수입니다. 다른 타입은TypeError, 음수는ValueError로 거부합니다.interval은bool이 아닌 유한한 0 이상의 정수 또는 실수입니다. 타입이 맞지 않으면TypeError, 음수나 비유한 값은ValueError로 거부합니다. 두 인자의 유효성은 브로커 메서드 호출 전에 검사합니다.RemoteError까지 재시도하면 원격 작업 오류 응답을 받은 경우에도 해당 요청을 다시 실행할 수 있습니다. 이 동작은 사용자가 선택한 예외 범위에 따른 의도된 결과이며, 멱등성이나 중복 방지는 이 요구사항에 포함되지 않습니다.인수 기준
아래 기준은 구현 완료 후 확인했으며, 검증 범위와 미실행 항목은 작업 종합에 기록합니다.
emit()과request()가 한 번만 호출되고 재시도 대기가 없습니다.0은 한 번,N은 최대N + 1번 호출합니다.N회 재시도는N회 대기만 수행하며, 마지막 실패 후에는 대기하지 않습니다.RemoteError도 지정 횟수까지 재시도합니다.priority·요청timeout·본문·작업 매개변수 전달이 기존 계약과 일치합니다.범위 제외
원문
CHANGELOG.md
Worker 메시지 발행·요청 재시도
emit()과request()에retry와interval옵션을 추가했습니다. 기본 설정은 기존처럼 한 번만 호출하며, 재시도 횟수를 설정하면 실패한 브로커 호출을 지정 횟수까지 다시 시도합니다.request()의timeout은 각 호출에 적용됩니다.브로커 호출에서 발생한
RemoteError를 포함한 예외도 재시도 대상입니다. 원격 작업이 이미 실행된 뒤 오류 응답을 받은 요청도 다시 실행될 수 있으므로, 중복 요청이나 부작용에 안전한 작업에만 재시도를 설정하세요.원문
IMPLEMENTS.md
Worker 메시지 발행·요청 재시도 구현
결과
요구사항 명세에 따라 Worker 메시지 함수의
emit()과request()에retry와interval키워드 인자를 추가했습니다. 기본값은 각각None과 1초입니다.None또는0은 한 번 호출하며,N은 최초 호출 후 최대N번 추가 호출합니다.입력 설정은 브로커 호출 전에 검증합니다. 재시도는 브로커의
emit()·request()호출에만 적용하고, 실패 후 시도가 남은 때만 대기하며, 최종 예외를 그대로 전파합니다.request()의timeout과 두 API의 기존 우선순위 전달을 재시도마다 유지합니다. 모든Exception을 대상으로 하므로RemoteError도 재시도되며, 중복 요청·작업 실행 방지는 제공하지 않습니다.브로커 인터페이스나 구현체, 연결 생성·종료 동작은 변경하지 않았습니다.
초기 구현 후 공개 인자명을
retry와interval로 변경했습니다. 현재 API와 문서에는 이전 이름을 남기지 않았습니다.검증
RemoteError, priority·timeout, 입력 검증을 확인했습니다.emit()·request()의 기존 호출부가 각각 호환됨을 확인했습니다.단계별 기록
원문
변경 유형
검증
TASKS.md
작업 종합
결과
이슈 #55의 요구를 현재 Worker API, Broker Protocol, 메시지 테스트와 작업 매뉴얼에 대조해 분석했다.
emit()·request()호출에만 재시도를 적용하고 입력 검증·지원 기능 확인은 재시도 바깥에 두었다. 구현 내용과 변경 파일은 구현 종합에 정리했다.사용자 선택에 따라 브로커 호출에서 발생하는 모든 예외를 재시도하며
RemoteError도 포함한다. 따라서 재시도 도중 동일 작업이나 요청이 반복될 수 있다는 제한과 문서 반영 필요성을 명시했다.단계별 기록
검증 결과와 제한사항
tests.test_task_messagesfocused suite의 13개 테스트가 통과했다. 기본 Python 명령은 editable.pth의 Windows symlink 권한 문제로 import에 실패했으나, workspace Python과 임시 unittest runner로 동일한 suite를 통과시켰다.Message.py에 진단이 없으며 변경 Python 파일의 syntax 오류가 없다.RemoteError도 재시도하므로 원격 작업이 이미 처리된 경우 중복 실행 가능성이 남는다.원문
확인 사항
Closes #55