피드로 돌아가기
Dev.toBackend
원문 읽기
Swift Actor 기반 BackgroundManager 도입으로 에이전트 루프 Non-blocking 구현
Background Tasks: The One Actor in the Codebase and the SIGTERM Bug That Only Broke on Linux
AI 요약
Context
기존 에이전트 루프가 모든 Tool Call을 동기적으로 처리함에 따라 발생하는 Blocking 문제 분석. 특히 빌드, 설치, 테스트 스위트와 같은 장시간 실행 작업 시 루프 전체가 유휴 상태가 되어 전체 시스템 처리 효율이 저하되는 병목 지점 식별.
Technical Solution
- BackgroundManager를 시스템 내 유일한 Actor로 설계하여 공유 상태(jobs, notifications)에 대한 동시성 접근 제어 및 Data Race 방지
- 느린 커맨드를 Worker에 위임하고 Job ID를 즉시 반환하는 비동기 실행 레이어 구축
- 실행 완료 결과를 Notification Queue에 적재하고, 매 API 호출 전 루프에서 이를 Drain 하여 컨텍스트에 주입하는 Notification Injection 패턴 적용
- ShellExecutor를 Sendable Struct로 구현하여 Actor 격리 경계를 안전하게 교차하는 데이터 전송 구조 설계
- 루프의 핵심 커널(API 호출-결과 처리-반복)은 유지하되, 주위로 기능을 확장하는 Injection Point 중심의 아키텍처 유지
실천 포인트
1. 모든 기능을 비동기로 전환하기보다, 핵심 루프는 동기적으로 유지하고 I/O 병목 지점만 비동기 레이어로 분리했는지 검토
2. 공유 상태 변경이 발생하는 지점에 명확한 격리 메커니즘(예: Swift Actor)을 적용하여 Data Race 가능성 제거
3. 비동기 작업 결과를 메인 흐름에 통합할 때, 폴링(Polling) 대신 이벤트 큐를 통한 주입(Injection) 패턴 고려