<aside> <img src="/icons/info-alternate_gray.svg" alt="/icons/info-alternate_gray.svg" width="40px" />

Table of Contents


</aside>

참고자료


https://www.confluent.io/blog/apache-kafka-for-service-architectures/

https://www.confluent.io/learn/event-driven-architecture/

https://medium.com/%40coffeeandtips.tech/quick-guide-about-apache-kafka-powering-event-driven-architecture-acded12e459f

https://kafka.apache.org/documentation/

https://youtu.be/-oXkuy_21BI?si=3qBGPU7iLoKOijSu

문서 작성 목적

이 문서를 작성한 이유와 배경을 설명합니다.


본 문서는 CloudPlatform의 핵심 구조를 이벤트 기반 아키텍처(EDA)로 전환하고, 그 중심 메시지 브로커로 Apache Kafka를 도입하기 위한 설계 가이드입니다. CloudPlatform의 외부 구조를 EDA로 설계함에 있어, 이벤트 처리의 핵심 컴포넌트인 Kafka를 효과적으로 활용하고자 합니다.

특히, 본 문서에서는 VPC 생성이라는 구체적인 시나리오를 통해 Kafka 이벤트의 정의와 흐름을 명확히 제시합니다. 이를 통해 CloudPlatform을 구성하는 각 컴포넌트 개발팀이 Kafka를 일관성 있게 이해하고 활용하는 데 필요한 실질적인 지침을 제공하고자 합니다.

목표

이 문서를 통해 해결하고자 하는 구체적인 목표를 정의합니다.


본 문서의 핵심 목표는 VPC 생성 사용자 플로우를 중심으로 EDA 환경에서 사용자 요청이 Kafka를 통해 어떻게 처리되는지 전체적인 흐름을 명확히 이해시키는 것입니다. 이를 통해 각 컴포넌트 개발팀은 자신의 역할과 Kafka 이벤트 해석 방안에 대한 명확한 인사이트를 얻고, 효율적인 개발 및 연동 작업을 수행할 수 있도록 지원합니다.

대상

이 문서를 읽어야 할 대상과 필요한 사전 지식을 설명합니다.


본 문서는 CloudPlatform 개발에 참여하는 모든 개발자를 대상으로 합니다. 특히 클라우드 플랫폼의 각 컴포넌트 역할에 대한 기본적인 이해를 갖춘 개발자를 주요 대상으로 하며, Kafka 및 EDA에 대한 사전 지식이 없더라도 본 문서를 통해 핵심 내용을 파악할 수 있도록 구성되었습니다.

문제 정의

현재 직면한 문제를 다양한 관점에서 분석하고, 원인과 영향을 설명합니다.


현재 CloudPlatform 개발팀은 EDA 기반 아키텍처로의 전환을 준비하고 있지만, 각 컴포넌트가 Kafka를 어떻게 바라보고, 어떤 방식으로 활용해야 하는지에 대한 명확한 공통 가이드라인이 부족한 상황입니다.

이러한 상황은 다음과 같은 문제점을 야기할 수 있습니다.

따라서, 본 문서는 VPC 생성 성공 시나리오를 기준으로 각 컴포넌트의 역할, 발행 및 구독해야 하는 Kafka 이벤트를 구체적으로 정의하여, 위에서 언급된 문제점들을 해결하고 개발 효율성을 높이며, 시스템의 안정적인 운영 기반을 마련하는 것을 목표로 합니다.

VPC 생성 시나리오

vm 생성을 위해 가장 기본이 되는 VPC를 기본으로 만든다고 생각하고, VPC 생성 시나리오를 기반으로 설명하겠습니다.


주요 컴포넌트 역할

1. Skin (React Client)

2. Blood (API Gateway & Auth Service)

3. Heart (Resource Management)

4. MuscleMemory (IaC Manager)

5. HeartBeat (Event Monitor)

VPC 생성 프로세스 흐름

1. 인증 단계

2. VPC 생성 요청

3. 내부 처리

4. 비동기 VPC 생성

5. 다단계 VPC 구성

6. 완료 및 정보 제공

VPC 생성 시퀀스 다이어그램

아래 사이트에서 자세히 확인 가능합니다.

https://mermaid.live/edit#pako:eNqtV21P21YU_itXljoFLWSEkJbkQyUg04ambFWjrdKULya5QESwWWKjMYQExanakgnQyHhZwsLWQjsxKQuBBolp_yf3-j_sXF8nvk4cmlbwBd_4Oe_POT53VUqpaSxFpTz-QcdKCscy8lxOXkwqCP7klKbm0Ld5nOPnJTmnZVKZJVnRUGIhoyA5z__7HmPAoqlsBivaUC94MquqaYbmD76JR9PoiyfoEzSha_Me-C8xHBieP4D6vKrnUhjFZUWew4veVhL6TJfgtKLgHIonJnrBX8mzCzJD8oeprJ7XvOK0FE1i2dFqHXyfL4MTKK4qGciRhzNxPZ_K4jheVHMrTNR19k3LU3YsXrLfLGElocmpBSboHCBrvdjYJAPFZE2ekfM4qXDEvXuInJRb75q00kSkto3gPz2tIHPPgN-p0aQvX3Ekq-7ww4esjFFBhh7t0frfHMLeAcSqXbStSQRYbwARm4TXT8_p0Vt6vINa9XUAckRscrhHQ6tea13ciBo6frS9fVY1N2qIVg2ydS74Ajjmtstf45_WxSUyD_fI24aQhe8eTSG6WYHXrtgR3SrT412PFAgCYohfqxpG6jLm7eAXsJUGOTX8aGo69hiR5h45qfjBmzJpFonxDnwvkYsGoscFUn3tlU7BHusKbhN96k6BO822pJ0dMc1thMVTj1g6qezkh_cJedogV-u0csB6BdH6ATm18229Z8mxe8tWCvFdG5BHSGhbNanc0KOaWSzYUdoCPbQwS1WydU1-f2HxEgzRZ0VWkdZV0SyVoYIlCF1kjWPaEeUoF4U6IbHeajXWQbPjJ93fcVPa8U5sTB6d45MHEUR4jzQzbRbK5l6RnP5nS39G9wvk5xrwxHzZ7HJVKBD4SbYPW82anX4XQ7uMdkYCdIDxCtTS34rmxvkA7lrDLoqWl1KBVA7mWEZVAhkYYRlZw2mLy3WmD0pTNn990eWt8PqvN2TruWnUyNkGHy-d8tISxG6XxLI23OYjm5tRS_SXqqCLPj-gZ7ucDIJagX5M0K1E8AQmwHWBS18Z1KiIPrvtDxB26_KcbBdE5nfmwhM8k1BTC1ij5RvG-qQkdpdVK7LzJim5EuCeVm3wmQG5hdOGuQl83y2DdFemnZkv9mLn1-FbOGBVwxk_lkkPcTdvPVnkctPX4edQNys4oJfl_amX12RNzwf0pfQttPMiz4Cs8ap7X5sfUPO-oQ5Q51umwN2U69AgfxbfNy66TblmxS0We-UEc87KwT8BBsyw_RrMZuQzSwZYYHO9Vf8X3g29d545Kuy5yPjMtQ3oa48Xnr6K3ds_dezTxYa6XUTmjCVof9Wr6_T49UCDdoDpelmmfxTsT5qr7--4E3r9-eixxxN328zrQdsrGq_r5gasY-1sek5CLi_CRBZ4bG79oF5bl4h1lq_-q5St9aRmHhVd4LvakjxCsIx5r0OOT13KvN0WtugOTEyHDavskq1Lz63cpawM63a_grvmE1tTtxts8z5b71t1yS8t4tyinEnDXXSV6U1K2jxc9JJSFB7TeFbWs1pSSiprAJV1TU2sKCkpquV07Jdyqj43L0Vn5WweTnzE2xfZNgTuSt-rqniUoqvSj1J0eDwQCo3cH4kEw5FI6P7Yg1G_tCJFg6PBwHgk8iAcDo-NBIOhcGjNL_1kaRgNBCOj4dD4WCQyHhoNhkMhv4TT7BoY53dp60q99j-fhNYF

sequenceDiagram
    actor User
    participant Skin as Skin (React Client)
    participant Blood as Blood (API GW & Auth)
    participant Heart as Heart (Resource Management)
    participant SubHeart as Heart Inner MSA
    participant Kafka as Kafka Cluster
    participant HeartBeat as HeartBeat (Event Monitor)
    participant MuscleMemory as MuscleMemory (IaC Manager)
    participant OpenStack as OpenStack API
    participant DB as Database

    %% 로그인 및 인증 프로세스
    User->>Skin: 로그인 요청
    Skin->>Blood: 인증 요청
    Blood->>DB: 사용자 검증
    DB-->>Blood: 인증 결과
    Blood-->>Skin: 인증 토큰 전달
    Skin-->>User: 로그인 성공 화면

    %% VPC 생성 프로세스 시작
    User->>Skin: VPC 생성 요청
    Note over User,Skin: VPC 이름, CIDR 블록, 서브넷 정보 입력
    Skin->>Blood: VPC 생성 API 요청 + 인증 토큰
    Blood->>Blood: 토큰 검증
    Blood->>Heart: VPC 생성 요청 전달

    %% Heart 내부의 MSA 처리
    Heart->>SubHeart: VPC 서비스로 요청 라우팅
    SubHeart->>DB: 사용자 할당량 및 리소스 권한 확인
    DB-->>SubHeart: 할당량 확인 결과
    
    %% IaC 관리 서비스에 요청
    SubHeart->>MuscleMemory: VPC 리소스 생성 요청
    MuscleMemory->>MuscleMemory: IaC 템플릿 생성/업데이트
    
    %% VPC 생성 비동기 처리 시작
    MuscleMemory->>OpenStack: 네트워크 생성 요청
    MuscleMemory->>Kafka: vpc.creation.initiated 이벤트 발행
    
    %% 이벤트 모니터링 및 사용자 알림
    Kafka-->>HeartBeat: 모든 이벤트 수집 및 모니터링
    HeartBeat->>HeartBeat: 이벤트 로깅 및 분석
    
    Kafka-->>Heart: vpc.creation.initiated 이벤트 구독
    Heart-->>Skin: WebSocket으로 "VPC 생성 시작됨" 알림
    Skin-->>User: 생성 진행 상태 표시
    
    %% OpenStack 처리
    OpenStack-->>OpenStack: 네트워크 및 서브넷 생성
    OpenStack-->>MuscleMemory: 네트워크 생성 진행 상태 (비동기)
    
    %% 상태 업데이트
    MuscleMemory->>Kafka: vpc.status.updated 이벤트 발행
    Kafka-->>HeartBeat: 이벤트 수집 및 모니터링
    Kafka-->>Heart: vpc.status.updated 이벤트 구독
    Heart-->>Skin: WebSocket으로 상태 업데이트
    Skin-->>User: 생성 진행 상태 업데이트
    
    %% 서브넷 생성
    OpenStack-->>MuscleMemory: 네트워크 생성 완료
    MuscleMemory->>OpenStack: 서브넷 생성 요청
    OpenStack-->>MuscleMemory: 서브넷 생성 완료
    
    %% 라우터 연결 (필요한 경우)
    MuscleMemory->>OpenStack: 라우터 생성 및 연결 요청
    OpenStack-->>MuscleMemory: 라우터 연결 완료
    
    %% VPC 생성 완료
    MuscleMemory->>DB: IaC 상태 및 VPC 정보 저장
    MuscleMemory->>Kafka: vpc.created 이벤트 발행
    
    %% 최종 결과 처리
    Kafka-->>HeartBeat: 이벤트 수집 및 모니터링
    Kafka-->>Heart: vpc.created 이벤트 구독
    Heart-->>Skin: WebSocket으로 "VPC 생성 완료" 알림
    Skin-->>User: VPC 생성 완료 화면 및 상세 정보 표시
    
    %% VPC 상세 정보 요청
    User->>Skin: VPC 상세 정보 요청
    Skin->>Blood: VPC 상세 정보 API 요청
    Blood->>Heart: VPC 정보 조회 요청
    Heart->>SubHeart: VPC 서비스로 요청 라우팅
    SubHeart->>DB: VPC 상세 정보 조회
    DB-->>SubHeart: VPC 정보
    SubHeart-->>Heart: VPC 정보 전달
    Heart-->>Blood: VPC 정보 응답
    Blood-->>Skin: VPC 정보 제공
    Skin-->>User: VPC 네트워크 토폴로지 및 상세 정보 표시

VPC 생성 관련 Kafka 이벤트 형식 설명

공통 이벤트 형식

모든 이벤트는 다음과 같은 공통 필드를 포함합니다. 이외에도 얼마든지 필요에 따라 추가 가능합니다.

{
  "eventId": "uuid-string",         // 이벤트 고유 식별자
  "eventType": "string",            // 이벤트 유형 (예: vpc.creation.initiated)
  "eventVersion": "1.0",            // 이벤트 스키마 버전
  "source": "string",               // 이벤트 발생 소스 (예: muscleMemory, heart)
  "timestamp": "ISO-8601-string",   // 이벤트 발생 시간
  "correlationId": "uuid-string",   // 연관된 요청/작업 ID (작업 추적용)
  "userId": "string",               // 요청한 사용자 ID
  "tenantId": "string",             // 테넌트/프로젝트 ID
  "payload": {                      // 이벤트 유형별 특화 데이터
    // 이벤트 유형에 따라 다른 구조
  }
}

1. 이벤트 식별 및 추적 가능성 강화

2. 표준화된 구조로 확장성 보장