DOCS/journey/troubleshooting/251019_claude_rb8001_미해결_이슈_정리.md

5.3 KiB

rb8001 미해결 이슈 정리

날짜: 2025-10-19
작성자: Claude (51124)
작성 원칙: DOCS/300_architecture/312_writing-principles.md 준수
참고: CLAUDE.md의 트러블슈팅 작성 규칙 및 범위


개요

로그 분석 및 기존 트러블슈팅 문서 검토 결과, 아래 5개 문제는 문서화는 되어 있으나 “최종 해결”이 확인되지 않았거나 운영 코드에 반영되지 않았습니다. 각 항목에 근거(로그/문서)와 제안 조치를 함께 정리합니다.


1) Gemini 429(쿼터) 초과 대응 미흡

  • 증상: 429 You exceeded your current quota, rate limit 에러 다수 발생
    • 로그 근거: rb8001/logs/rb8001.log:46714, rb8001/logs/rb8001.log:46949, rb8001/logs/rb8001.log:46626
  • 관련 문서: DOCS/troubleshooting/251002_emotion_circular_reference_fix.md(배경 언급), DOCS/troubleshooting/250915_rate_limiting_미구현.md(Gateway 기준 해결)
  • 현황: Gateway 레이트 리미팅은 해결로 표기(51123)이나, rb8001의 LLM 호출 레벨에서 백오프/모델 폴백/캐싱 적용에 대한 “코드 반영” 기록 미확인
  • 제안 조치(코드):
    • rb8001/app/llm/gemini_handler.pychat() 내 429 대응(지수 백오프, 제한 재시도, 폴백 모델 settings.GEMINI_FALLBACK_MODEL) 추가
    • 응답 캐싱(동일 요청 1분 내 재사용) 고려

2) gRPC + uvloop BlockingIOError 로그 노이즈

  • 증상: BlockingIOError: [Errno 11] Resource temporarily unavailable (gRPC PollerCompletionQueue)
    • 로그 근거: rb8001/logs/rb8001.log:43161 (또는 52995/54247 근처)
  • 관련 문서: DOCS/troubleshooting/251016_grpc_uvloop_blocking_error.md
  • 현황: 문서에서 “로깅 레벨 억제” 권고까지 있으나, uvloop 제거/채널 재사용 등 기능적 완화는 “미구현”으로 표기
  • 제안 조치(코드):
    • rb8001/app/core/logger.py에서 gRPC 로거 CRITICAL 유지 확인, 필요 시 asyncio 로거 WARNING
    • 고비용 구간에서 uvloop 비활성화 검토(rb8001/main.py 초기부) 또는 gRPC 채널 재사용 확인(분류기/LLM 호출부)

3) /complete의 user_id='external_service'로 인한 감정/대화 저장 오류

  • 증상: emotion_readings/user 로그 저장 시 invalid UUID 오류 및 conversation 저장 시 NULL 유발
    • 로그 근거: rb8001/logs/rb8001.log:53672, rb8001/logs/rb8001.log:53691
  • 코드 근거: rb8001/main.py:156/complete 엔드포인트가 user_id="external_service" 고정
  • 관련 문서: DOCS/troubleshooting/251016_emotion_analysis_test_results.md(원인 정리), DOCS/troubleshooting/251016_troubleshooting_summary.md(system UUID 정책 제안)
  • 현황: 원인/대응 원칙은 문서화되었으나, /complete의 사용자 식별 처리 수정 내역 미확인
  • 제안 조치(코드):
    • rb8001/main.py:146-174/complete에서
      1. 헤더 X-User-Id가 있으면 해당 UUID 사용
      2. 없으면 시스템 전용 UUID로 대체(문서 제안) 또는 저장 스킵
    • DB 저장 경로에서 비-UUID는 확실히 건너뛰기(log INFO)

4) skill-email 연동 준비 미완료 (토큰/스키마)

  • 증상: 8501 연동 500, 토큰/스키마 부재로 이메일 조회 실패
    • 로그 근거: rb8001/logs/rb8001.log:251, rb8001/logs/rb8001.log:300relation "gmail_tokens" does not exist, 500 재시도 후 실패
  • 관련 문서: DOCS/troubleshooting/250817_email_skill_integration_status.md(현황/TODO), DOCS/troubleshooting/250909_slack_briefing_failure.md(토큰/브리핑 이슈)
  • 현황: 설계/DB 테이블 초안까지만 있고, 실제 테이블 생성/배포/검증 기록 미확인
  • 제안 조치:
    • 51123 DB에 gmail_token(또는 합의된 테이블명) 생성 및 skill-email에서 참조
    • rb8001 → skill-email 페이로드 스키마 합의/검증 스크립트 추가

5) 이벤트 루프 오용(“Cannot run the event loop while another loop is running”)

  • 증상: rb8001에서 비동기 호출 패턴 오류
    • 로그 근거: rb8001/logs/rb8001.log:45947, rb8001/logs/rb8001.log:46104
  • 관련 문서: DOCS/troubleshooting/250805-06_happybell80_AI응답개선Phase1-5.md(rb10508 기준 해결 패턴), rb8001 전용 최종 반영 문서 미확인
  • 현황: 원인/패턴은 정리되었으나 rb8001 내 동기 API 호출을 run_in_executor로 감싸는 등 일관 반영 내역 미확인
  • 제안 조치(코드):
    • 동기 라이브러리 호출부(예: LLM SDK 동기 메서드, 파일 IO)를 asyncio.get_running_loop().run_in_executor(...)로 래핑
    • asyncio.gather()에는 awaitable만 전달하는지 점검

교훈

  • UUID 원칙 준수: 시스템/외부 호출에도 일관된 사용자 식별 정책 필요
  • 외부 API는 쿼터/레이트리밋/폴백을 “코드 레벨”에서 강제
  • 성능 개선 도구(uvloop) 도입 시 의존성(gRPC) 호환성 사전 검증
  • 스킬 간 계약(API 스키마/테이블)은 명시적 문서+검증 스크립트로 관리

다음 단계(요약)

  1. /complete 사용자 식별 수정: rb8001/main.py:146-174
  2. Gemini 429 대응 로직 추가: rb8001/app/llm/gemini_handler.py
  3. skill-email 토큰 테이블 생성/연동 검증(51123)
  4. run_in_executor 적용 범위 점검과 수정
  5. gRPC+uvloop 충돌 완화(필요 시 uvloop 비활성화 범위 축소/조정)