mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 11:26:26 +00:00
이벤트생성플로우 outer sequence 수정
- User Service 회원정보 조회 로직 추가 - AI Service Redis 저장 및 5분 타임아웃 적용 - Content Service Redis 읽기/쓰기 방식으로 변경 - 이미지 생성 5분 타임아웃 적용 - Redis → Event DB 영구 저장 로직 추가 - Kafka 이미지 생성 topic 구독 제거 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
fb55fd85a0
commit
16f82d3553
@ -7,11 +7,13 @@ actor "소상공인" as User
|
|||||||
participant "Frontend" as FE
|
participant "Frontend" as FE
|
||||||
participant "API Gateway" as Gateway
|
participant "API Gateway" as Gateway
|
||||||
participant "Event Service" as Event
|
participant "Event Service" as Event
|
||||||
|
participant "User Service" as UserSvc
|
||||||
participant "AI Service" as AI
|
participant "AI Service" as AI
|
||||||
participant "Content Service" as Content
|
participant "Content Service" as Content
|
||||||
participant "Distribution Service" as Dist
|
participant "Distribution Service" as Dist
|
||||||
participant "Kafka" as Kafka
|
participant "Kafka" as Kafka
|
||||||
database "Event DB" as EventDB
|
database "Event DB" as EventDB
|
||||||
|
database "User DB" as UserDB
|
||||||
database "Redis" as Redis
|
database "Redis" as Redis
|
||||||
participant "외부 AI API" as AIApi
|
participant "외부 AI API" as AIApi
|
||||||
participant "이미지 생성 API" as ImageApi
|
participant "이미지 생성 API" as ImageApi
|
||||||
@ -19,8 +21,16 @@ participant "배포 채널 APIs" as ChannelApis
|
|||||||
|
|
||||||
== 1. 이벤트 목적 선택 (UFR-EVENT-020) ==
|
== 1. 이벤트 목적 선택 (UFR-EVENT-020) ==
|
||||||
User -> FE: 이벤트 목적 선택
|
User -> FE: 이벤트 목적 선택
|
||||||
FE -> Gateway: POST /events/purposes\n{목적, 매장정보}
|
FE -> Gateway: POST /events/purposes\n{목적, userId}
|
||||||
Gateway -> Event: 이벤트 목적 저장 요청
|
Gateway -> Event: 이벤트 목적 저장 요청
|
||||||
|
Event -> UserSvc: GET /api/users/{userId}/store\n회원 및 매장정보 조회
|
||||||
|
activate UserSvc
|
||||||
|
UserSvc -> UserDB: 사용자 및 매장 정보 조회
|
||||||
|
activate UserDB
|
||||||
|
UserDB --> UserSvc: 사용자, 매장 정보 반환
|
||||||
|
deactivate UserDB
|
||||||
|
UserSvc --> Event: 200 OK\n{userId, storeName, industry, address}
|
||||||
|
deactivate UserSvc
|
||||||
Event -> EventDB: 이벤트 목적 정보 저장\n(목적, 매장정보 저장)
|
Event -> EventDB: 이벤트 목적 정보 저장\n(목적, 매장정보 저장)
|
||||||
EventDB --> Event: 저장 완료
|
EventDB --> Event: 저장 완료
|
||||||
Event --> Gateway: 저장 완료\n{eventDraftId}
|
Event --> Gateway: 저장 완료\n{eventDraftId}
|
||||||
@ -41,12 +51,12 @@ Kafka --> AI: Consume Job Message\n{jobId, eventDraftId, ...}
|
|||||||
|
|
||||||
AI -> EventDB: 과거 이벤트 데이터 조회\n(업종, 지역 기반 통계 조회)
|
AI -> EventDB: 과거 이벤트 데이터 조회\n(업종, 지역 기반 통계 조회)
|
||||||
EventDB --> AI: 이벤트 통계 데이터
|
EventDB --> AI: 이벤트 통계 데이터
|
||||||
AI -> AIApi: 트렌드 분석 및 이벤트 추천 요청\n{목적, 업종, 지역, 과거데이터, 매장정보}
|
AI -> AIApi: 트렌드 분석 및 이벤트 추천 요청\n{목적, 업종, 지역, 과거데이터, 매장정보}\n[Circuit Breaker, Timeout: 5분]
|
||||||
AIApi --> AI: 3가지 추천안 + 트렌드 요약\n(예: "여름철 시원한 음료 선호도 증가")
|
AIApi --> AI: 3가지 추천안 + 트렌드 요약\n(예: "여름철 시원한 음료 선호도 증가")
|
||||||
AI -> Redis: 추천 결과 캐싱\n(3가지 추천안, 트렌드 요약 저장)\nTTL: 24시간
|
AI -> Redis: AI 추천 결과 저장\nKey: ai:event:{eventDraftId}\n(3가지 추천안, 트렌드 요약)\nTTL: 24시간
|
||||||
Redis --> AI: 저장 완료
|
Redis --> AI: 저장 완료
|
||||||
AI -> Redis: Job 상태 업데이트\n(상태를 COMPLETED로 변경)
|
AI -> Redis: Job 상태 업데이트\n(상태를 COMPLETED로 변경)
|
||||||
note over AI, Redis: AI 추천 정보는 Redis에만 저장\n최종 선택 시 Event DB에 저장
|
note over AI, Redis: AI 추천 정보는 Redis에 저장\n- Content Service가 읽기 위함\n- 최종 승인 시 Event DB에 영구 저장
|
||||||
|
|
||||||
group Polling으로 상태 확인
|
group Polling으로 상태 확인
|
||||||
loop 상태 확인 (최대 30초)
|
loop 상태 확인 (최대 30초)
|
||||||
@ -78,30 +88,39 @@ FE --> User: 콘텐츠 생성 화면으로 이동
|
|||||||
|
|
||||||
== 3. SNS 이미지 생성 - 비동기 처리 (UFR-CONT-010) ==
|
== 3. SNS 이미지 생성 - 비동기 처리 (UFR-CONT-010) ==
|
||||||
User -> FE: 이미지 생성 요청
|
User -> FE: 이미지 생성 요청
|
||||||
FE -> Gateway: POST /api/events/{eventDraftId}/content-generation\n{이벤트정보}
|
FE -> Gateway: POST /api/events/{eventDraftId}/content-generation
|
||||||
Gateway -> Event: 이미지 생성 요청
|
Gateway -> Event: 이미지 생성 요청
|
||||||
Event -> Kafka: Publish to image-job-topic\n{jobId, eventDraftId, 이벤트정보}
|
Event -> Event: Job 생성\n{jobId, eventDraftId, status: PENDING}
|
||||||
Event --> Gateway: Job 생성 완료\n{jobId, status: PENDING}
|
Event --> Gateway: Job 생성 완료\n{jobId, status: PENDING}
|
||||||
Gateway --> FE: 202 Accepted\n{jobId}
|
Gateway --> FE: 202 Accepted\n{jobId}
|
||||||
FE --> User: "이미지 생성 중..." (로딩)
|
FE --> User: "이미지 생성 중..." (로딩)
|
||||||
|
|
||||||
note over Content: Kafka Consumer\n이미지 생성 topic 구독
|
note over Content: 백그라운드 워커\nRedis 폴링 또는 스케줄러
|
||||||
Kafka --> Content: Consume Job Message\n{jobId, eventDraftId, ...}
|
|
||||||
|
Content -> Redis: AI 이벤트 데이터 읽기\nKey: ai:event:{eventDraftId}
|
||||||
|
activate Redis
|
||||||
|
Redis --> Content: AI 추천 결과\n{선택된 추천안, 이벤트 정보}
|
||||||
|
deactivate Redis
|
||||||
|
|
||||||
note over Content: inner sequence 참조:\ncontent-이미지생성.puml
|
note over Content: inner sequence 참조:\ncontent-이미지생성.puml
|
||||||
|
|
||||||
par 심플 스타일
|
par 심플 스타일
|
||||||
Content -> ImageApi: 심플 스타일 생성 요청
|
Content -> ImageApi: 심플 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분]
|
||||||
ImageApi --> Content: 심플 이미지 URL
|
ImageApi --> Content: 심플 이미지 URL
|
||||||
else 화려한 스타일
|
else 화려한 스타일
|
||||||
Content -> ImageApi: 화려한 스타일 생성 요청
|
Content -> ImageApi: 화려한 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분]
|
||||||
ImageApi --> Content: 화려한 이미지 URL
|
ImageApi --> Content: 화려한 이미지 URL
|
||||||
else 트렌디 스타일
|
else 트렌디 스타일
|
||||||
Content -> ImageApi: 트렌디 스타일 생성 요청
|
Content -> ImageApi: 트렌디 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분]
|
||||||
ImageApi --> Content: 트렌디 이미지 URL
|
ImageApi --> Content: 트렌디 이미지 URL
|
||||||
end
|
end
|
||||||
|
|
||||||
note over Content: Redis 캐시에 이미지 URL 저장\nJob 상태를 COMPLETED로 업데이트\n\n이미지 URL은 Redis에만 저장됨\n최종 콘텐츠 선택 시 Event DB에 저장
|
Content -> Redis: 이미지 URL 저장\nKey: content:image:{eventDraftId}\n{심플, 화려, 트렌디 URL}\nTTL: 7일
|
||||||
|
activate Redis
|
||||||
|
Redis --> Content: 저장 완료
|
||||||
|
deactivate Redis
|
||||||
|
Content -> Redis: Job 상태 업데이트\n(상태를 COMPLETED로 변경)
|
||||||
|
note over Content, Redis: 이미지 URL은 Redis에 저장\n- 최종 승인 시 Event DB에 영구 저장
|
||||||
|
|
||||||
group Polling으로 상태 확인
|
group Polling으로 상태 확인
|
||||||
loop 상태 확인 (최대 30초)
|
loop 상태 확인 (최대 30초)
|
||||||
@ -135,6 +154,22 @@ FE --> User: 배포 채널 선택 화면으로 이동
|
|||||||
User -> FE: 배포 채널 선택\n최종 승인 요청
|
User -> FE: 배포 채널 선택\n최종 승인 요청
|
||||||
FE -> Gateway: POST /api/events/{eventDraftId}/publish\n{선택 채널 목록}
|
FE -> Gateway: POST /api/events/{eventDraftId}/publish\n{선택 채널 목록}
|
||||||
Gateway -> Event: 최종 승인 및 배포 처리
|
Gateway -> Event: 최종 승인 및 배포 처리
|
||||||
|
|
||||||
|
note over Event: Redis 데이터를 Event DB에 영구 저장
|
||||||
|
|
||||||
|
Event -> Redis: AI 추천 결과 조회\nKey: ai:event:{eventDraftId}
|
||||||
|
activate Redis
|
||||||
|
Redis --> Event: AI 추천 결과
|
||||||
|
deactivate Redis
|
||||||
|
|
||||||
|
Event -> Redis: 이미지 URL 조회\nKey: content:image:{eventDraftId}
|
||||||
|
activate Redis
|
||||||
|
Redis --> Event: 이미지 URL 목록
|
||||||
|
deactivate Redis
|
||||||
|
|
||||||
|
Event -> EventDB: 이벤트 정보 영구 저장\n(AI 추천, 이미지 URL, 배포 채널 포함)
|
||||||
|
EventDB --> Event: 저장 완료
|
||||||
|
|
||||||
Event -> EventDB: 이벤트 상태 변경\n(DRAFT → APPROVED로 업데이트)
|
Event -> EventDB: 이벤트 상태 변경\n(DRAFT → APPROVED로 업데이트)
|
||||||
EventDB --> Event: 상태 변경 완료
|
EventDB --> Event: 상태 변경 완료
|
||||||
Event -> Kafka: Publish to event-topic\nEventCreated\n{eventId, 이벤트정보}
|
Event -> Kafka: Publish to event-topic\nEventCreated\n{eventId, 이벤트정보}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user