Skip to content

feat(backend): s3·aiServer 헬스 indicator + 컨테이너 healthcheck 를 readiness 로 - #184

Merged
i3months merged 1 commit into
devfrom
feature/s3-ai-health-indicators
Aug 19, 2026
Merged

feat(backend): s3·aiServer 헬스 indicator + 컨테이너 healthcheck 를 readiness 로#184
i3months merged 1 commit into
devfrom
feature/s3-ai-health-indicators

Conversation

@i3months

Copy link
Copy Markdown
Member

변경 사항

#183 에서 남겨둔 부분. /api/system/health 의 종합 status 가 s3·aiServer 미구현 탓에 UNKNOWN 으로 고정돼 있어 엔드포인트를 쓸 수 없었다.

indicator 두 개

S3HealthIndicatorheadBucket 으로 엔드포인트·자격증명·버킷을 한 번에 확인한다. 스토리지가 죽으면 이력서 업로드·음성 답변·TTS 재생이 전부 실패한다. ObjectStorageClient.verifyAvailable() 을 추가했다 — get/put 은 대상 키가 필요해서 헬스체크에 쓸 수 없다.

AiServerHealthIndicator작업 큐의 컨슈머 수로 판단한다.

HTTP 로 AI 서버를 찌르지 않은 이유:

  • 아키텍처 §4.1 이 Core→AI 는 RabbitMQ 전용으로 못 박고 있고, Core 에는 AI 서버 URL 설정이 아예 없다. 헬스체크 하나 때문에 새 HTTP 의존과 새 환경변수를 만들 이유가 없다
  • 컨슈머 수가 더 정확한 신호다. 프로세스가 살아 있는 것보다 큐를 실제로 구독 중인가가 중요하다. 컨슈머 0 이면 질문 생성·꼬리질문·피드백이 전부 큐에 쌓이기만 한다 — HTTP 200 은 이 상태를 못 잡는다

브로커 자체가 죽은 경우는 DOWN 이 아니라 UNKNOWN 으로 둔다. rabbitmq 컴포넌트가 이미 알려주는 사실이라, 여기서 DOWN 을 겹쳐 내면 "AI 가 죽었다" 로 오독된다.

빈 이름이 곧 Actuator 키가 되도록 맞췄다(s3HealthIndicators3, aiServerHealthIndicatoraiServer) — #183 과 정확히 같은 함정이라 SystemHealthService 는 한 줄도 안 고쳤다.

컨테이너 healthcheck 를 종합 → readiness 로

이게 이 PR 의 진짜 판단이다. indicator 를 추가하면 종합(/actuator/health)에 s3·aiServer 가 들어가는데, 컨테이너 healthcheck 가 그 종합을 보고 있었다. 그대로 두면 AI 가 죽었다는 이유로 백엔드 컨테이너가 unhealthy 가 되어 정작 멀쩡한 로그인·히스토리·이력서 업로드까지 rotation 에서 빠진다. 상황을 더 나쁘게 만드는 쪽이다.

healthcheck 를 /actuator/health/readiness 로 바꾸고 readiness 그룹을 명시했다:

group:
  readiness:
    include: readinessState, db, rabbit

그냥 liveness 로 바꾸지 않은 이유: liveness 기본 그룹은 livenessState 뿐이라 DB 장애도 배포 게이트를 통과해 버린다. 지금 게이트가 잡아주는 안전성을 잃는다. 백엔드가 자기 일을 하려면 반드시 필요한 것(DB·RabbitMQ)만 남겼다.

그룹 멤버십 검증(validate-group-membership)은 기본값(엄격)을 유지한다 — 이름을 틀리면 부팅이 실패해 배포에서 잡힌다. 조용히 UNKNOWN 이 되는 것보다 낫다. #183 이 정확히 그 실패였다. 테스트 프로파일은 DataSource 를 제외하므로 거기서만 그룹을 축소했다.

결과

엔드포인트 이전 이후
/api/system/health UNKNOWN (고정) 4개 컴포넌트 실제 상태 종합
/api/system/ready #183 로 이미 UP 그대로
컨테이너 healthcheck 종합 (AI·S3 포함) readiness (DB·RabbitMQ)

테스트

  • AiServerHealthIndicatorTest (4) — 컨슈머 있음 UP, 0이면 DOWN(쌓인 메시지 수 포함), 큐 없음 DOWN, 브로커 불가 UNKNOWN
  • S3HealthIndicatorTest (2) — 도달 가능 UP, 실패 시 DOWN + 사유

backend test 통과(ArchUnit·컨텍스트 로딩 포함).

영향 범위

  • DB 마이그레이션: 없음
  • API contract 변경: 없음 (응답 키 그대로, 값만 실제 상태로)
  • 배포 동작 변경 있음: 컨테이너 healthcheck 경로가 바뀐다. 머지 후 배포에서 backend 가 healthy 로 올라오는지 확인 필요
  • 환경변수: 없음

리뷰어 체크포인트

  • AI 생존 판단에 ai.generate.questions 큐 하나만 본다. 여러 큐를 보거나 최소 컨슈머 수를 요구하는 게 나을지
  • readiness 그룹에 s3 를 넣을지 — 이력서 업로드가 핵심 기능이면 넣는 것도 말이 된다. 지금은 "스토리지가 죽어도 면접 진행·조회는 된다" 로 판단해 뺐다

…ness 로

#183 에서 남겨둔 부분. `/api/system/health` 의 종합 status 가 s3·aiServer 미구현 때문에
UNKNOWN 으로 고정돼 있어 엔드포인트를 쓸 수 없었다.

## indicator 두 개

- `S3HealthIndicator` — `headBucket` 으로 엔드포인트·자격증명·버킷을 한 번에 확인.
  스토리지가 죽으면 이력서 업로드·음성 답변·TTS 재생이 전부 실패한다.
  `ObjectStorageClient.verifyAvailable()` 을 추가했다(get/put 은 대상 키가 필요해서 헬스체크에
  쓸 수 없다).
- `AiServerHealthIndicator` — **작업 큐의 컨슈머 수**로 판단한다. Core 는 AI 를 HTTP 로
  호출하지 않으므로(아키텍처 §4.1: RabbitMQ 전용) 헬스체크 하나 때문에 Core→AI HTTP 의존을
  새로 만들지 않았다. 컨슈머 수가 오히려 정확한 신호다 — 프로세스 생존보다 **큐를 실제로
  구독 중인가**가 중요하고, 컨슈머 0 이면 질문 생성·꼬리질문·피드백이 쌓이기만 한다.
  브로커 자체가 죽은 경우는 UNKNOWN 으로 둔다(그건 rabbitmq 컴포넌트가 알려주므로 DOWN 을
  겹쳐 내면 "AI 가 죽었다" 로 오독된다).

빈 이름이 곧 Actuator 키가 되도록 맞췄다(`s3HealthIndicator`→`s3`) — #183 과 같은 함정.

## 컨테이너 healthcheck 를 종합 → readiness 로

indicator 를 추가하면 종합(`/actuator/health`)에 s3·aiServer 가 들어가는데, 컨테이너
healthcheck 가 그 종합을 보고 있었다. 그대로 두면 **AI 가 죽었다고 백엔드 컨테이너가
unhealthy 가 되어** 정작 멀쩡한 로그인·히스토리까지 rotation 에서 빠진다.

healthcheck 를 `/actuator/health/readiness` 로 바꾸고 readiness 그룹을
`readinessState + db + rabbit` 으로 **명시**했다. 그냥 liveness 로 바꾸면 DB 장애도 배포
게이트를 통과해 버리므로, 백엔드가 자기 일을 하려면 반드시 필요한 것만 남겼다.

그룹 멤버십 검증은 기본값(엄격)을 유지한다 — 이름을 틀리면 부팅이 실패해 배포에서 잡힌다.
조용히 UNKNOWN 이 되는 것보다 낫다(#183 이 정확히 그 실패였다). 테스트 프로파일은
DataSource 를 제외하므로 거기서만 그룹을 축소했다.

## 테스트

- `AiServerHealthIndicatorTest` (4) — 컨슈머 있음 UP, 0이면 DOWN(쌓인 메시지 수 포함),
  큐 없음 DOWN, 브로커 불가 UNKNOWN
- `S3HealthIndicatorTest` (2) — 도달 가능 UP, 실패 시 DOWN + 사유
@i3months
i3months merged commit a3099fb into dev Aug 19, 2026
5 checks passed
@i3months
i3months deleted the feature/s3-ai-health-indicators branch August 19, 2026 06:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant