Skip to content

비동기/AI 처리 안정화: bounded executor, 재처리, 알림, 복구 루트 #241

Description

@Goder-0

Overview

  • 요약 생성과 AI 동기화는 프로덕션 핵심 플로우인데, 현재 실패 처리 방식은 운영 개입에 많이 의존한다.
  • 로그를 보면 재시도는 있지만, 자동 복구와 운영용 제어면은 부족하다.

Details

  • LinkSyncEventListener 는 실패 시 [CRITICAL] ... 수동 복구 필요 로그를 남긴다.
  • SummaryWorker 는 AI 서버 실패 시 최대 3번 재시도 후 FAILED 로 종료한다.
  • 실제 로그에 아래 케이스가 있다.
  • 2026-06-09: CREATE 동기화 최종 실패가 여러 건 발생
  • 2026-06-10: UPDATE 동기화 최종 실패가 반복 발생
  • 2026-06-15: 링크 459, 460 의 초기 요약 요청 실패 후 최종 실패
  • 로그 스레드명이 SimpleAsyncTaskExecutor-* 로 찍혀 @Async 작업이 기본 executor 에 의존하고 있음을 보여준다.

작업 내용

  • @Async 전용 bounded ThreadPoolTaskExecutor 를 명시적으로 설정한다.
  • 큐 크기, rejection policy, thread name prefix, MDC 전파를 설계한다.
  • AI 연동 실패를 null 반환보다 typed exception 과 명시적 상태 전이로 다룬다.
  • 외부 API 실패 로그에는 최소한 아래 필드를 구조화해 남긴다.
  • target=ai-server
  • method
  • status
  • attempt
  • durationMs
  • errorCode
  • 최종 실패 건을 재처리 가능한 dead-letter 또는 운영 큐에 적재한다.
  • 운영 알림 채널을 추가한다.
  • Slack
  • PagerDuty 또는 현재 사용 중인 알림 시스템
  • 링크 단위 재시도/복구용 운영 도구나 admin endpoint 를 둔다.
  • 외부 AI 호출에는 timeout, circuit breaker, 실패율 모니터링을 붙인다.

Expected Outcome

  • 일시적 AI 장애가 곧바로 수동 복구 이슈로 번지지 않는다.
  • 최종 실패 건의 수, 원인, 재처리 상태를 운영자가 추적할 수 있다.
  • 외부 API 오류가 null 이나 후행 NPE 로 흐려지지 않고, 원인 그대로 관찰된다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions