🛠️ 계획된 리팩토링할 기능
RequestExpiryService.deleteExpiredRequest() — 만료된 Request의 인프라 리소스 정리 로직
🛠 사유
현재 운영 코드에서 만료 삭제 시 Pod 삭제를 아예 수행하지 않고 Account/PVC만 삭제한다.
그 결과 K8s에 좀비 Pod가 남아 GPU/CPU 리소스를 계속 점유하며, 운영자가 수동으로 정리해야 한다.
또한 Pod 삭제를 추가하더라도 실패 시 예외를 swallow하면 DB가 DELETED로 바뀌어 스케줄러 재시도 경로가 사라진다.
개선 방향:
- Pod 삭제 로직 추가
- Pod 삭제 실패 시 Slack 알림(1순위 안전망) + Redis Queue(best-effort 자동 재시도)
- Slack이 primary, Redis는 보조 buffer (현재 Redis가 emptyDir 기반이라 유실 가능)
- 별도
@Scheduled 스케줄러가 Redis Queue에서 RPOP → 재시도, max_retries 초과 시 Slack "수동 개입 필요" 발송
📝 check-lists
🛠️ 계획된 리팩토링할 기능
RequestExpiryService.deleteExpiredRequest()— 만료된 Request의 인프라 리소스 정리 로직🛠 사유
현재 운영 코드에서 만료 삭제 시 Pod 삭제를 아예 수행하지 않고 Account/PVC만 삭제한다.
그 결과 K8s에 좀비 Pod가 남아 GPU/CPU 리소스를 계속 점유하며, 운영자가 수동으로 정리해야 한다.
또한 Pod 삭제를 추가하더라도 실패 시 예외를 swallow하면 DB가 DELETED로 바뀌어 스케줄러 재시도 경로가 사라진다.
개선 방향:
@Scheduled스케줄러가 Redis Queue에서 RPOP → 재시도, max_retries 초과 시 Slack "수동 개입 필요" 발송📝 check-lists
RequestExpiryService에PodService.deletePod()호출 추가CleanupFailedEvent발행@TransactionalEventListener(AFTER_COMMIT)으로 Slack 알림 → Redis LPUSH 순서 처리CleanupScheduler구현 (10분 간격, RPOP → 재시도 → 실패 시 LPUSH/Slack)PodService.deletePod()에서@Transactional(propagation = MANDATORY)제거