kt-event-marketing/design/backend/sequence/inner/content-이미지생성.puml
doyeon e321eacde4 시퀀스 다이어그램 수정: 이미지 생성 후 DB 저장 프로세스 추가
1. 다중채널배포 outer sequence 수정
   - inner sequence 참조 명시 (distribution-다중채널배포.puml)
   - Sprint 2 Mock 처리 반영
   - API 엔드포인트 일관성 유지

2. 이미지 생성 프로세스 개선
   - Content Service: 이미지 생성 후 Kafka 이벤트 발행 추가
   - Event Service: 새로운 Kafka Consumer 추가 (event-콘텐츠생성완료구독.puml)
   - Event DB에 이미지 URL 영구 저장
   - Redis 캐시와 DB 간 데이터 정합성 보장

3. 아키텍처 개선
   - 서비스 독립성 향상 (Kafka 기반 이벤트 통신)
   - 느슨한 결합 구조
   - 데이터 흐름 명확화

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 10:01:48 +09:00

244 lines
8.8 KiB
Plaintext

@startuml content-이미지생성
!theme mono
title Content Service - 이미지 생성 내부 시퀀스 (UFR-CONT-010)
actor Client
participant "Kafka\nimage-job\nConsumer" as Consumer
participant "JobHandler" as Handler
participant "CacheManager" as Cache
participant "ImageGenerator" as Generator
participant "ImageStyleFactory" as Factory
participant "StableDiffusion\nAPI Client" as SDClient
participant "DALL-E\nAPI Client" as DALLEClient
participant "Circuit Breaker" as CB
participant "CDNUploader" as CDN
participant "JobStatusManager" as JobStatus
database "Redis Cache" as Redis
note over Consumer: Kafka 구독\nimage-job 토픽
== Kafka Job 수신 ==
Consumer -> Handler: Job Message 수신\n{jobId, eventDraftId, eventInfo}
activate Handler
Handler -> Cache: 캐시 조회\nkey: content:image:{eventDraftId}
activate Cache
Cache -> Redis: GET content:image:{eventDraftId}
Redis --> Cache: 캐시 데이터 또는 NULL
Cache --> Handler: 캐시 결과
deactivate Cache
alt 캐시 HIT (기존 이미지 존재)
Handler -> JobStatus: Job 상태 업데이트\nstatus: COMPLETED (캐시)
activate JobStatus
JobStatus -> Redis: SET job:{jobId}\n{status: COMPLETED, imageUrls: [...]}
JobStatus --> Handler: 업데이트 완료
deactivate JobStatus
Handler --> Consumer: 처리 완료 (캐시)
else 캐시 MISS (새로운 이미지 생성)
Handler -> JobStatus: Job 상태 업데이트\nstatus: PROCESSING
activate JobStatus
JobStatus -> Redis: SET job:{jobId}\n{status: PROCESSING}
JobStatus --> Handler: 업데이트 완료
deactivate JobStatus
Handler -> Generator: 3가지 스타일 이미지 생성 요청\n{eventInfo}
activate Generator
== 3가지 스타일 병렬 생성 (par 블록) ==
group parallel
Generator -> Factory: 심플 프롬프트 생성\n{eventInfo, style: SIMPLE}
activate Factory
Factory --> Generator: 심플 프롬프트
deactivate Factory
Generator -> CB: Circuit Breaker 체크
activate CB
CB --> Generator: State: CLOSED (정상)
deactivate CB
Generator -> SDClient: Stable Diffusion API 호출\n{prompt, style: SIMPLE}\nTimeout: 20초
activate SDClient
note over SDClient: Circuit Breaker 적용\nRetry: 최대 3회\nTimeout: 20초
alt API 성공
SDClient --> Generator: 심플 이미지 URL
deactivate SDClient
Generator -> CDN: CDN 업로드 요청\n{imageUrl, eventId, style: SIMPLE}
activate CDN
CDN --> Generator: CDN URL (심플)
deactivate CDN
else API 실패 (Timeout/Error)
SDClient --> Generator: 실패 응답
deactivate SDClient
Generator -> CB: 실패 기록
activate CB
CB -> CB: 실패율 계산
alt 실패율 > 50%
CB -> CB: Circuit State: OPEN
end
CB --> Generator: Circuit State
deactivate CB
Generator -> DALLEClient: Fallback - DALL-E API 호출\n{prompt, style: SIMPLE}\nTimeout: 20초
activate DALLEClient
alt Fallback 성공
DALLEClient --> Generator: 심플 이미지 URL
deactivate DALLEClient
Generator -> CDN: CDN 업로드 요청\n{imageUrl, eventId, style: SIMPLE}
activate CDN
CDN --> Generator: CDN URL (심플)
deactivate CDN
else Fallback 실패
DALLEClient --> Generator: 실패 응답
deactivate DALLEClient
Generator -> Generator: 기본 템플릿 사용\n(심플)
end
end
Generator -> Factory: 화려한 프롬프트 생성\n{eventInfo, style: FANCY}
activate Factory
Factory --> Generator: 화려한 프롬프트
deactivate Factory
Generator -> CB: Circuit Breaker 체크
activate CB
CB --> Generator: State: CLOSED/OPEN
deactivate CB
alt Circuit CLOSED
Generator -> SDClient: Stable Diffusion API 호출\n{prompt, style: FANCY}\nTimeout: 20초
activate SDClient
alt API 성공
SDClient --> Generator: 화려한 이미지 URL
deactivate SDClient
Generator -> CDN: CDN 업로드 요청\n{imageUrl, eventId, style: FANCY}
activate CDN
CDN --> Generator: CDN URL (화려한)
deactivate CDN
else API 실패
SDClient --> Generator: 실패 응답
deactivate SDClient
Generator -> DALLEClient: Fallback - DALL-E API 호출
activate DALLEClient
alt Fallback 성공
DALLEClient --> Generator: 화려한 이미지 URL
deactivate DALLEClient
Generator -> CDN: CDN 업로드
activate CDN
CDN --> Generator: CDN URL (화려한)
deactivate CDN
else Fallback 실패
DALLEClient --> Generator: 실패 응답
deactivate DALLEClient
Generator -> Generator: 기본 템플릿 사용\n(화려한)
end
end
else Circuit OPEN
Generator -> Generator: Circuit Open\n즉시 기본 템플릿 사용
end
Generator -> Factory: 트렌디 프롬프트 생성\n{eventInfo, style: TRENDY}
activate Factory
Factory --> Generator: 트렌디 프롬프트
deactivate Factory
Generator -> CB: Circuit Breaker 체크
activate CB
CB --> Generator: State: CLOSED/OPEN
deactivate CB
alt Circuit CLOSED
Generator -> SDClient: Stable Diffusion API 호출\n{prompt, style: TRENDY}\nTimeout: 20초
activate SDClient
alt API 성공
SDClient --> Generator: 트렌디 이미지 URL
deactivate SDClient
Generator -> CDN: CDN 업로드 요청\n{imageUrl, eventId, style: TRENDY}
activate CDN
CDN --> Generator: CDN URL (트렌디)
deactivate CDN
else API 실패
SDClient --> Generator: 실패 응답
deactivate SDClient
Generator -> DALLEClient: Fallback - DALL-E API 호출
activate DALLEClient
alt Fallback 성공
DALLEClient --> Generator: 트렌디 이미지 URL
deactivate DALLEClient
Generator -> CDN: CDN 업로드
activate CDN
CDN --> Generator: CDN URL (트렌디)
deactivate CDN
else Fallback 실패
DALLEClient --> Generator: 실패 응답
deactivate DALLEClient
Generator -> Generator: 기본 템플릿 사용\n(트렌디)
end
end
else Circuit OPEN
Generator -> Generator: Circuit Open\n즉시 기본 템플릿 사용
end
end
Generator --> Handler: 3가지 이미지 URL 반환\n{simple, fancy, trendy}
deactivate Generator
== 결과 캐싱 및 Job 완료 ==
Handler -> Cache: 이미지 URL 캐싱\nkey: content:image:{eventDraftId}\nTTL: 7일
activate Cache
Cache -> Redis: SET content:image:{eventDraftId}\n{simple, fancy, trendy}\nTTL: 604800 (7일)
Redis --> Cache: 저장 완료
Cache --> Handler: 캐싱 완료
deactivate Cache
Handler -> JobStatus: Job 상태 업데이트\nstatus: COMPLETED
activate JobStatus
JobStatus -> Redis: SET job:{jobId}\n{status: COMPLETED, imageUrls: [...]}
JobStatus --> Handler: 업데이트 완료
deactivate JobStatus
== Kafka 이벤트 발행 (이미지 생성 완료) ==
note over Handler: Kafka 이벤트 발행하여\nEvent Service에 결과 전달
Handler -> Consumer: Kafka 이벤트 발행
activate Consumer
Consumer -> Consumer: Kafka Producer로\nevent-topic 발행\nContentCreated\n{jobId, eventDraftId, imageUrls}
note right
Event Service는 Kafka Consumer로
ContentCreated 이벤트를 구독하여
Event DB에 이미지 URL 저장
end note
deactivate Consumer
Handler --> Consumer: 처리 완료
end
deactivate Handler
note over Consumer, Redis
**Resilience 패턴 적용**
- Circuit Breaker: 실패율 50% 초과 시 Open
- Timeout: 20초
- Fallback: Stable Diffusion 실패 시 DALL-E, 모두 실패 시 기본 템플릿
- Cache-Aside: Redis 캐싱 (TTL 7일)
**처리 시간**
- 캐시 HIT: 0.1초
- 캐시 MISS: 5초 이내 (병렬 처리)
**병렬 처리**
- 3가지 스타일 동시 생성 (par 블록)
- 독립적인 스레드 풀 사용
**CDN 업로드**
- 이미지 생성 후 CDN 업로드
- CDN URL 반환 및 캐싱
end note
@enduml