gugbab2's GitBook
  • Language
    • C++
      • 강의
        • C++ 언매니지드 프로그래밍
          • C++ 프로그래밍
          • 출력(Output)
          • 입력(Input)
          • bool 타입, Reference
          • 상수(const)
          • 문자열(string)
          • 파일 입출력
          • 개체지향 프로그래밍1
          • 개체지향 프로그래밍2
          • 개체지향 프로그래밍3
          • 캐스팅(형변환, casting)
          • 인라인 함수
          • static 키워드
          • 예외(Exception)
          • STL(Standard Template Library) 컨테이너(Container) - Vector
          • STL 컨테이너 - Map
          • STL 컨테이너 - Queue, Stack, Set, List
          • 템플릿(Template) 프로그래밍
          • 새로운 키워드(C++11 ~) 1
          • 새로운 키워드(C++11 ~) 2
          • 새로운 자료형
          • 새로운 STL 컨테이너
          • 스마트(smart) 포인터
          • 이동생성자 및 이동대입연산자
          • constexpr
          • Lamda Expression
      • 책
        • The C++ Programming Lanuaage
          • 2부 : 기본 기능
            • 6. 타입과 선언
            • 7. 포인터, 배열, 참조
            • 8. 구조체(struct), 공용체(union), 열거형(enum)
            • 10. 표현식
            • 11. 선택 연산
            • 12. 함수
            • 13. 예외 처리
            • 15. 소스 파일과 프로그램
          • 3부 : 추상화 메커니즘
            • 16. 클래스
            • 17. 생성, 소멸, 복사와 이동
            • 18. 연산자 오버로딩
            • 19. 특수 연산자
            • 20. 파생클래스
        • 씹어먹는 C++
          • 2. C++ 참조자(reference) 의 도입
          • 5.1 연산자 오버로딩(비교, 대입 연산자)
          • 5-2. 연산자 오버로딩(이항, 입출력, 타입변환, 증감 연산자)
          • 6-2. 가상(virtual) 함수와 다형성
          • 6-3. 가상 함수에 대한 지식들
          • 9-1. 코드를 찍어내는 틀 - C++ 템플릿(template)
          • 9-2. 가변 길이 템플릿(Variadic template)
          • 9-3. 템플릿 메타 프로그래밍 (Template Meta Programming)
          • 9-4. 템플릿 메타 프로그래밍2
          • 16.1 유니폼 초기화(Uniform Initialization)
          • 토막글 2. 람다(lambda)
    • Java
      • 강의
        • 김영한의 실전 자바 - 기본편
          • 절차 지향 vs 객체 지향
            • 절차 지향 프로그래밍
            • 객체 지향 프로그래밍
          • 변수
            • 클래스 변수 / 인스턴스 변수, 멤버 변수 / 지역 변수
            • 기본형 vs 참조형
          • 패키지
            • 패키지
            • CLI 환경에서 .java 파일 컴파일 && 실행
          • 접근 제어자
            • 접근 제어자 - 기본
            • 캡슐화
          • static
            • 자바 메모리 구조
            • static 기본
            • 스택 영역, 힙 영역
              • 스택 영역, 힙 영역 - 기본
              • 메소드가 실행될 때 어떤일이 일어나는가?
          • 상속
            • 상속 기본
          • 다형성(Pilymorphism)
            • 다형성 기본
            • 다형성의 활용
              • 다형성의 활용 - 기본
              • 다형성의 활용 - 추상클래스
              • 다형성의 활용 - 인터페이스
            • 다형성과 설계
              • 좋은 객체 지향 프로그래밍
        • 김영한의 실전 자바 - 중급1편
          • 1. Object 클래스
          • 2. 불변 객체
          • 3. String 클래스
          • 4. 래퍼, Class 클래스
          • 5. 열거형 - ENUM
          • 6. 날짜와 시간
          • 7. 중첩 클래스, 내부 클래스1
          • 8. 중첩 클래스, 내부 클래스2
          • 9. 예외 처리1 - 이론
          • 10. 예외 처리 - 실습
        • 김영한의 실전 자바 - 중급2편
          • 1. 제네릭 - Generic1
          • 2. 제네릭 - Generic2
          • 3. 컬렉션 프레임워크 - ArrayList
          • 4. 컬렉션 프레임워크 - LinkedList
          • 5. 컬렉션 프레임워크 - List
          • 6. 컬렉션 프레임워크 - 해시(Hash)
          • 7. 컬렉션 프레임워크 - HashSet
          • 8. 컬렉션 프레임워크 - Set
            • 레드 블랙 트리
          • 9. 컬렉션 프레임워크 - Map, Stack, Queue
            • 왜(?) Set 은 내부에서 Map 을 사용할까?
          • 10. 컬렉션 프레임워크 - 순회, 정렬, 전체 정리
        • 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
          • 프로세스와 스레드 소개
          • 스레드 생성과 실행
          • 스레드 제어와 생명 주기1
          • 스레드 제어와 생명 주기2
          • 메모리 가시성
          • 동기화 - synchronized
            • synchronized 키워드 이해도 체크
          • 고급 동기화 - concurrent.Lock
          • 생산자 소비자 문제1
          • 생산자 소비자 문제2
          • CAS - 동기화와 원자적 연산
          • 동시성 컬렉션
          • 스레드 풀과 Executor 프레임워크1
          • 스레드 풀과 Executor 프레임워크2
        • 김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
          • 문자 인코딩
          • I/O 기본1
          • I/O 기본2
          • I/O 활용
          • File, Files
          • 네트워크 - 프로그램1
          • 네트워크 - 프로그램2
          • 채팅 프로그램
          • HTTP 서버 만들기
          • 리플렉션
          • 애노테이션
          • HTTP 서버 활용
        • 김영한의 실전 자바 - 고급3편, 람다, 스트림, 함형 프로그래밍
          • 람다가 필요한 이유
          • 람다
          • 함수형 인터페이스
          • 람다 활용
          • 람다 vs 익명 클래스
          • 메서드 참조
          • 스트림API1 - 기본
          • 스트림 API2 - 기능
          • 스트림 API3 - 컬렉터
          • Optional
          • 디폴트 메서드
          • 병렬 스트림
          • 함수형 프로그래밍
        • 기초 탄탄! 독하게 시작하는 Java - Part2: OOP 와 JVM
          • 2. 클래스 - 첫 번째
          • 3. 클래스 - 두번째
          • 4. 상속과 관계
          • 6. JVM(Java Virtual machine) 기본 이론
          • 7. JVM 과 GC 그리고 객체
          • 8. 불변 객체와 String 클래스
      • 책
        • 자바의 신
          • 변수
            • 클래스 변수(static) 사용 주의 케이스
            • Java volatile 과 Atomic 변수(+CAS)
          • 연산자
            • 비트 연산자 활용 예제
          • 배열
          • 참조 자료형
          • 상속
          • Object 클래스
          • interface, abstract class, enum
          • 예외
          • String 클래스
            • String 구조
            • String 문자열을 byte 로 변환하기
            • String 클래스에서 자주 사용되는 메서드
            • String 클래스로 살펴보는 불변(Immutable)객체
            • StringBuilder, StringBuffer
          • Nested 클래스
          • 어노테이션
            • 어노테이션 기본
            • 어노테이션의 사용
          • JVM 이해하기
            • 왜 JVM 을 사용해?
            • JVM, JRE, JDK
            • JVM 구조 이해하기
            • 클래스 로더 시스템
            • JIT(Just-In-Time) 컴파일러
            • GC(Garbage Collector)
              • GC Part.1
              • GC Part.2
              • GC 튜닝
          • java.lang
            • Wrapper 클래스
            • System 클래스
          • Generic
            • 제네릭 기본
            • 와일드카드
            • 와일드카드 GET / SET 경계
            • 와일드카드 extends / super 사용시기
            • 혼동할 수 있는 와일드카드 표현
          • Collection
            • 자료구조
              • 이진 탐색 트리 vs 레드 블랙 트리
            • Collection
            • List
              • ArrayList
              • Vector
              • Stack
              • LinkedList
            • Set, Queue
              • HashSet
              • LinkedHashSet
              • TreeSet
              • Priority Queue
              • ArrayDeque
            • Map
              • HashMap
              • Hashtable
              • LinkedHashMap
              • TreeMap
          • Thread
            • Thread 기본
            • Thread 와 관련이 많은, Synchronized
            • Thread 를 통제하는 메서드
            • ThreadGroup
          • I/O
            • InputStream, OutputStream
            • Reader, Writer
          • Serializable, NIO
            • Serializable
            • NIO (New IO)
          • 네트워크 프로그래밍
            • 네트워크 기본 & TCP 통신
            • UDP 통신
          • 람다
            • 함수형 인터페이스
            • 람다란?
        • 벨둥(Bealdung)
          • Java Concurrency
            • Java Concurrency Basics
              • Overview of the java.util.concurrent
              • Guide to the Synchronized Keyword in Java
              • Guide to the Volatile Keyword in Java
              • Guide to the java.util.concurrent.Future
              • ThreadLocal in Java
      • 그 외
        • 시스템 콜과 자바에서의 시스템 콜 사용례
        • 자바 NIO 의 동작원리 및 IO 모델
        • 함수형 인터페이스(FunctionInterface) - 자바8
  • Spring
    • 강의
      • 스프링 핵심 원리 - 기본편
        • 큰 흐름 잡기
        • 스프링 핵심 원리 이해1 - 예제 만들기
        • 스프링 핵심 원리 이해2 - 객체 지향 원리 적용
        • 스프링 컨테이너와 스프링 빈
        • 싱글톤 컨테이너
        • 컴포넌트 스캔
        • 의존관계 자동 주입
        • 빈 생명주기 콜백
        • 빈 스코프
      • 토비의 스프링6 - 이해와 원리
        • 3. 오브젝트와 의존관계1
        • 3. 오브젝트와 의존관계2
        • 4. 테스트
        • 5. 템플릿
        • 6.예외
        • 7. 서비스 추상화
    • 책
      • JSP 2.3 웹 프로그래밍
        • Servlet
        • JSP
        • 쿠키 / 세션
        • MVC 패턴
        • 실무 때 고민할 만한 부분
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해
        • 자바와 절차적/구조적 프로그래밍
        • 객체지향의 4대 특성
        • 객체지향 설계의 5원칙
        • 스프링이 사랑한 디자인 패턴
        • IoC / DI
        • AOP(Aspect Oriented Programming), 관점 지향 프로그래밍
      • 토비의 스프링 3.1
        • Spring vs Spring Boot
        • 1. 오브젝트와 의존관계
          • 1.4 제어의 역전(IoC)
          • 1.5 스프링의 IoC
          • 1.6 싱글톤 레지스트리와 오브젝트 스코프
    • 그 외
      • 스프링 부트(SpringBoot) 탄생 배경
  • CS
    • DATA STRUCTURES
      • 선택 정렬(Selection Sort)
      • 버블 정렬(Bubble Sort)
      • 삽입 정렬(Insertion Sort)
    • OS
      • 강의
      • 책
        • 혼자 공부하는 컴퓨터구조 + 운영체제
          • 1. 컴퓨터 구조 시작하기
          • 2. 데이터
          • 3. 명령어
          • 4. CPU 의 작동원리
          • 5. CPU 성능 향상 기법
          • 6. 메모리와 캐시메모리
          • 7. 보조기억장치
          • 8. 입출력장치
          • 9. 운영체제 시작하기
          • 10. 프로세스와 스레드
    • NETWORK
      • 그 외
        • REST API
          • REST API
          • URI & MIME type
          • Collection Pattern
          • Collection Pattern 적용
          • Spring Web MVC 구현
        • SSL 인증 동작
        • DTO & JSON & CROS
          • DTO
          • 직렬화(Serialization)
          • Jackson ObjectMapper
          • CROS
        • Connection Timeout / Read Timeout
      • 강의
        • 외워서 끝내는 네트워크 핵심이론 - 기초
          • Internet 기반 네트워크 입문
            • Host 는 이렇게 외우자
            • 스위치가 하는 일과 비용
          • L2 수준에서 외울 것들
            • NIC, L2 Frame, LAN 카드 그리고 MAC 주소
            • L2 스위치에 대해서
            • LAN 과 WAN 의 경계 그리고 Broadcast
          • L3 수준에서 외울 것들
            • IPv4 주소의 기본 구조
            • L3 IP Packet 으로 외워라
            • 패킷의 생성과 전달 및 계층별 데이터 단위
            • 이해하면 인생이 바뀌는 TCP/IP 송, 수신 구조
            • IP 헤더 형식
            • 서브넷 마스크와 CIDR
            • Broadcast IP 주소와 Localhost
            • TTL 과 단편화
            • 인터넷 설정 자동화를 위한 DHCP
            • ARP 과 Ping(RTT : Round Trip Time)
          • L4 수준 대표주자 TCP 와 UDP
            • TCP 와 UDP 개요
            • TCP 연결 및 상태 변화
            • TCP 연결 종료 및 상태 변화
            • TCP, UDP 헤더 형식과 게임서버 특징
            • TCP 가 연결이라는 착각
            • TCP 연결과 게임버그
          • 웹을 이루는 핵심기술
            • DNS
            • URL, URI
        • 외워서 끝내는 네트워크 핵심 이론 - 응용
          • 네트워크 장치의 구조
            • 세 가지 네트워크 장치 구조
            • Inline 구조
            • Out of path 구조와 DPI 그리고 망중립
            • Proxy(클라이언트 입장) - 우회
            • Proxy(클라이언트 입장) - 보호와 감시
            • Reverse Proxy(서버 입장)
          • 인터넷 공유기의 작동 원리
            • 공유기 개요
            • Symmetric NAT
            • Full Cone 방식
            • Restricted Cone, Port Restricted Cone
            • 포트 포워딩
            • UPnP 와 NAT
          • 부하분산 시스템 작동 원리
            • L4 부하분산 무정지 시스템
            • 대규모 부하분산을 위한 GSLB
          • VPN과 네트워크 보안 솔루션
            • PN 과 VPN
            • IPSec VPN 과 터널링 개념
            • VPN 과 재택근무
        • 외워서 끝내는 SSL 과 최소한의 암호기술
          • 기초이론
            • Checksum (검사합)
            • Hash
          • 암호기술에 대한 이해
            • 대칭키
            • 비대칭키
          • PKI 시스템과 인터넷
            • 인터넷을 위한 비대칭키 체계
            • 공개키 신뢰를 위한 검증체계
            • 웹서비스와 공인인증서
      • 책
        • 그림으로 배우는 네트워크 원리
          • 1. 네트워크 기본
          • 2. 네트워크를 만드는 것
          • 3. 네트워크의 공통 언어 TCP/IP
    • SECURITY
      • 그 외
        • Basic Auth
        • HMAC 기반 인증
    • 그 외
      • 동기/비동기 & 블로킹/논블록킹
  • DB
    • 그 외
      • 인덱스(Index)
      • 트랜잭션(TRANSACTION)
      • 실무에서 외래키를 사용하지 않는 이유
      • ORM vs SQL Mapper
      • 문자열 vs DATE
      • EXPLAIN 명령어
    • 강의
      • Real MySQL 시즌 1
        • Part.1
          • 1강. CHAR vs VARCHAR
          • 2강. VARCHAR vs TEXT
          • 3강. COUNT(*) & COUNT(DISTINCT) 튜닝
          • 4강. 페이징 쿼리 작성
          • 5강. Stored Function
      • 토크온 41차. JPA 프로그래밍 기본 다지기
        • 1. JPA 소개
        • 2. JPA 기초와 매핑
        • 3. 필드와 컬럼 매핑
        • 4. 연관관계 매핑
        • 5. 양방향 매핑
        • 6. JPA 내부구조
        • 7. JPA 객체지향쿼리
        • 8. Spring Data JPA 와 QueryDSL 이해
    • 책
  • Software Development Methodology
    • TDD
      • 강의
        • Spring Boot TDD - 입문부터 실전까지 정확하게
          • 세션2. TDD 소개
          • 세션5. API 설계
          • 세션6. TDD 주기 첫 번째 경험
          • 세션7. TDD 주기 반복
      • 그 외
        • 단위 테스트(Unit Test) 작성의 필요성
        • JUnit5
          • A Guide to JUnit 5
          • Guide to JUnit 5 Parameterized Tests
          • AssertJ Exception Assertions
          • Testing in Spring Boot
          • Junit 과 Mockito 기반의 Spring 단위 테스트 코드 작성법
        • Code Coverage
          • Code Coverage?
    • DDD
      • 책
        • 도메인 주도 설계(Domain-Driven Design)
          • 04 - 도메인의 격리
          • 05 - 소프트웨어에서 표현되는 모델
          • 06 - 도메인 객체의 생명주기
          • 07 - 언어의 사용(확장 예제) (1)
          • 07 - 언어의 사용(확장 예제) (2)
        • 도메인 주도 개발 시작하기
          • 1. 도메인 모델 시작하기
          • 2. 아키텍처 개요
          • 3. 애그리거트
          • 4. 리포지터리와 모델 구현
            • DAO vs Repository
      • 강의
        • DDD 세레나데(NEXTSTEP)
          • 1주차
            • 도메인 주도 설계 등장 배경
            • 레거시 코드
            • 유연한 설계 - ASSERTION
          • 2주차
            • 전략적 설계 - UBIQUITOUS LANGUAGE
            • 전략적 설계 - BOUNDED CONTEXT
          • 3주차
            • 전술적 설계 - VALUE OBJECT 와 ENTITY
            • 전술적 설계 - AGGREGATE 와 REPOSITORY
            • 전술적 설계 - SERVICE
    • REFACTORING
      • 일급 컬렉션(First Class Collection) 소개와 사용해야하는 이유
  • ARCHITECTURE
    • Event Driven Architecture
  • 멘토링
    • F-Lab
      • 10회차(2024.12.29)
Powered by GitBook
On this page
  • Event Driven?
  • Event Driven MicroService?
  • 그렇다면 왜 Event Driven MicroService 를 적용하는가?
  • MSA 적용을 위한 고려사항
  • 효과
  • 비즈니스 흐름
  • 트랜잭션 처리
  • 비동기 메세지 큐를 통한 시스템 내 통합(integration)
  1. ARCHITECTURE

Event Driven Architecture

Previous일급 컬렉션(First Class Collection) 소개와 사용해야하는 이유NextF-Lab

Last updated 6 months ago

참고 링크

Event Driven?

  • Event Driven 은 programming, Architecture 등과 연결되어 다양한 정의로 표현된다.

    • 컴퓨터 회로를 구동시키기 위해 발생하는 일 (마우스 클릭, 키보드 타이핑, 모바일 터치) 등

    • 특정 행동이 자동으로 순서에 따라 발생하는 것이 아닌 일에 대한 반응으로 동작하는 디자인 패턴

    • 시스템 내 외부에 발생한 주목할 만한 상태의 변화에 기반한 동작

    • 등등 ..

Event Driven MicroService?

  • Event Driven MicroService(EDM) 은 MSA 가 적용된 시스템에서 이벤트 발생 시 해당 이벤트 로그를 보관하고 이를 기반으로 동작하며, 비동기 통신을 통해 시스템 내 통합(integration) 을 수행하는 Architecture 이다.

이벤트

  • IT 영역에서 이벤트는 다양한 정의를 갖지만, 이 곳에서 언급하는 이벤트는 상태의 변경. 즉 데이터의 변경, 생성, 삭제를 통해 발생하는 서비스를 의미한다.

이벤트 로그 보관

  • 현재의 데이터는 상태 변경의 누적이라는 아이디어에서 시작한다. 이 때 상태 변경은 이벤트를 뜻하고, 이를 누적하는 행위는 이벤트 로그를 보관하는 것이다. EDM 에서 생성된 이벤트는 반드시 보관되어야 한다. 이는 현재 상태를 구성하는 근간이 된다. 또한 보관된 이벤트를 바탕으로 장애 발생 또는 특정 요구사항에 따라 지점된 시점으로 복원을 수행한다.

  • 이벤트 로그를 보관하는 장소를 이벤트 스토어라 칭한다.

비동기 통신

  • 메세징 프로토콜을 통한 메세지 큐 방식이 자주 사용된다.

  • 서비스에서 데이터의 생성, 변경, 삭제를 통해 이벤트가 발생하면 발행 서비스는 메세지 형태로 이벤트를 발행하고, 해당 이벤트에 관심이 있는 서비스에서 구독을 수행한다.

시스템 내 통합(integration)

  • 이상적으로 구현된 MSA 는 서비스간 데이터 참조를 위한 내부 통신이 필요없지만, 현실적으로 서비스 간 내부 통신이 전혀 없는 시스템을 구현하기란 불가능에 가깝다.

  • 다양한 사유로 여러 서비스 간 통신을 통해 연동이 발생한다.

  • 이벤트를 데이터의 변경, 생성, 삭제로 정의했기 때문에 MSA 의 데이터 관리와 밀접한 연관성을 갖는다. 데이터는 현재의 상태를 나타내고 이는 보관된 데이터 변경, 생성, 삭제 기록 즉 이벤트 로그에 기반한다.

    • 특정 서비스에서 기능을 수행한다.

    • 이벤트가 발생(데이터의 생성, 변경, 삭제) 하면 해당 도메인 객체를 기반으로 이벤트를 생성한다.

    • 생성된 이벤트는 저장 공간에 보관되고 비동기 메세지 큐로 해당 이벤트에 관심이 있는 서비스들에게 전달된다.

    • 이벤트를 구독한 서비스는 해당 이벤트를 처리한다.

    • 수행 도중 오류가 발생하면 저장된 이벤트 로그를 기반이로 retry/rollback 을 수행한다.

  • MSA 는 나뉘어진 서비스와 서비스 별 각자의 데이터베이스 구성을 지향한다. 이로 인해 발생하는 새로운 구조적 요구사항들이 있다. EDM 을 적용해 새로운 요구사항들을 충족시킬 수 있다.

  • 서비스 별 각자 데이터베이스를 적용한 시스템에서 데이터 무결성을 보장할 수 없다. 하지만, EDM 을 통해 최종적인 데이터의 일관성을 유지할 수 있다.

    • 예를 들어, A 서비스에서 데이터가 변경된 것을 B 서비스에서도 바로 알기 위해서는 중앙에서 모든 데이터 변경을 통제해야 하는데, MSA 구조에서는 이런 중앙화 된 트랜잭션이 없습니다.

    • 여기서 주의할 점은, A 서비스의 변경사항이 B 서비스에 영향을 주는 경우에만 데이터가 전파되는 것이 의미가 있다.

그렇다면 왜 Event Driven MicroService 를 적용하는가?

  • MSA(MicroServer Architecture) 가 Event Driven 과 연결되어 언급되는 이유는 무엇일까?

  • MSA 를 도입하여 느슨한 결합, 관심사의 집중, 단일 책임 원칙, 빠른 배포주기, 폴리글랏(?), calability, 장애의 격리, 유연성, 확장성 등 여러 이점을 확보할 수 있습니다.

  • 하지만 이를 위해서 넘어야 하는 허들이 있다.

MSA 적용을 위한 고려사항

  • MSA 를 적용한 시스템은 서비스가 쪼개지고 데이터베이스가 쪼개진다. MSA 에서 주요 원칙 중 하나는 서비스 별 자체 로직과 데이터, 그에 따른 최적의 DB 를 선택하는 것이다.

    • 이상적으로 하나의 기능을 수행할 때 자신의 서비스 내에서 모두 해결할 수 있도록 분리를 잘한다면 시스템 내 통합은 고려하지 않아도 된다.

    • 하지만 현실적으로 서비스 분리에 따른 서비스 간 데이터 참조 등 시스템 내부에 연결이 발생한다. 또한, 서비스가 뭉쳐져 있을 때 발휘되던 장점을 활용하지 못하는 경우도 발생한다.

Database Per Service

  • Database Per Service 는 MSA 의 느슨한 결합, 관심사의 집중, 폴리글랏(?) 프로그래밍, 독립적인 배포 주기 등을 달성하기 위한 핵심 키워드이다.

  • 하지만 Database Per Service 는 가장 어려운 부분 중 하나이다.

  • DB 변경 / 분리 시 고려해야 하는 요소들은 다음과 같다.

    • 엔터프라이즈에서 데이터가 가장 중요한 자산

      • 금융 데이터, 통신 사용량 등 돈과 관련한 데이터

      • 데이터를 기반으로 사용자 인사이트 확보 -> 돈, 매출의 중요한 기반 요소 (데이터 자체가 돈이 된다)

      • 기업 리더 중 90% 가 토지, 인재, 자본 등과 마찬가지로 데이터도 가장 중요한 리소스인 동시에 가장 기본적인 차별화 요소로 판단

      • 데이터 기반 경제 -> 의사결정의 기반

    • Shared 관계형 데이터베이스 장점 사용 불가

      • 데이터를 효율적으로 보관하고 조회 / 삭제 등 기능의 효율이 높이는 장점

      • 테이블 조인을 통한 통합 뷰 제공

      • 트랜젝션 가능 ..

    • database oriented system

      • 모든 업무의 정의는 DB 스키마 / 테이블 설계부터 시작

      • 결국 세스템의 성격은 데이터의 CRUD 기능, 데이터의 흐름과 life cycle 이 중요

      • DB 분리는 결국 기존 데이터의 흐름을 깨는 행위 ..

    • 데이터베이스 분리시 발생하는 비용

    • 기존 DBMS 에 최적화된 각종 세팅

    • 기타 등등 ..

  • 위와 같은 이유로 Database Per Service 를 적용하는 것은 어렵다. 하지만 반대로 중앙화된 Shared Database 를 사용하는 것은 많은 제약사항이 있다.

    • 중앙화 된 Shared Database DB 는 시스템의 응집력을 저해하고 종속성을 높인다.

    • 단일 트랜잭션 처리에 따라 테이블 락 등 장애 발생 가능성이 있다.

    • 중앙화 된 DB 에 장애 발생 시 전체 시스템 장애를 일으킨다.

    • DB 스케일링이 어렵다.

    • 서비스 특징에 따른 최적의 DB 선택이 어렵다.

  • 기존의 관계형 데이터베이스 구성에서 MSA 의 이점을 살리기 어려운 이유는 명확하다.

  • 하지만, 기존의 관계형 데이터베이스 구성, 그 중 관계형 DB 를 사용하는 경우, 트랜잭션 처리, 데이터 무결성, Join 사용, 관계를 활용한 데이터 저장 / 조회 등 DBMS 레벨에서 여러 유용한 기능을 사용했었다.

    • Database Per Serivce 를 적용하면 관계형 DB 레벨에서 제공하는 기능을 Application 레벨에서 해결해야 한다.

  • Database Per Service 적용의 기술적으로 어려운 부분을 해결하는데 Event Driven 이 효율적으로 적용된다.

폴리글랏 (서비스 별 다른 스팩을 가지는 것을 의미)

  • 모바일, SNS, IOT 등 다양한 시스템이 발전하고 있는 상황에서 이들 시스템이 다루는 데이터는 스트림 형태의 비정형 데이터가 많다.

  • 매우 빠른 읽기/쓰기 성능을 지원해야 하고 분산형 구조를 통해 데이터를 여러 대의 서버에 저장한다. 상호 복제해 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조 등 기존 관계형 DB 에 최적화 되지 않은 기능을 요구한다.

  • 확장성, 단순한 구조, 낮은 비용, 빠른 검색 등의 NoSQL DB 가 적합하다.

  • 이런 경우 MSA 의 Database Per Service 를 적용해 각 서비스 목적에 맞는 최적의 DB 를 선택할 수 있다.

  • 기존 시스템에서 서로 다른 DB 를 사용하는 경우 두 DB 간 트랜잭션 처리가 어려웠다. 하지만 MSA 에서는 다른 서비스의 데이터를 참조할 때 직접 접근하지 않고 데이터의 캡슐화를 통해 API 를 통해서만 접근할 수 있도록 한다.

  • DBMS 레벨이 아닌 Application 레벨에서 트랜잭션 처리를 수행하는데 적합해 서비스의 목적에 최적화 된 DB 를 선택하는데 도움을 준다.

효과

  • MicroService 에 Event Dreiven 을 엮으면 MSA 를 도입하면서 새로 발생한 요구 사항(허들) 을 달성할 수 있다 .

    • 비지니스 흐름에 따른 로직 수행

    • 분산 트랜잭션 처리

    • 서비스 간 반정규화 데이터 동기 처리

    • 적절한 시스템 통합

    • 최종적인 일관성

비즈니스 흐름

  • 핫초코를 구매하는 과정을 생각해보자.

    • 메뉴 선택

    • 카운터에서 핫초코 주문 -> 상태 변화

    • 계산 -> 상태 변화

    • 핫초코 만들기 -> 상태 변화

    • 핫초코 먹기 -> 상태 변화

  • 핫초코 구매라는 하나의 기능이 여러 단계에 걸쳐서 수행된다. 각 단계마다 상태 변화를 동반한다. 이전 단계를 완료하면 그에 반응해서 다음 단계를 수행한다.

  • MSA 에서 각 단계별로 서비스를 구현했다면 menu -> order -> pay -> make -> delivery 서비스 순서대로 동작할 것이다. 이 연결 관계에서 비지니스 흐름을 파악하는 것은 기능 수행을 위해서 매우 중요하다 .

  • 이 일련의 과정에 EDM 을 적용해 상태가 변경되면 이벤트를 발생시키고, 이를 관심 있는 서비스가 수신 후 기능을 수행하면서 비지니스 흐름에 따라 각 서비스의 기능을 수행할 수 있다.

트랜잭션 처리

  • 오류가 발생하는 상황을 가정해보자

    • 메뉴 선택

    • 카운터에서 핫초코 주문 -> 상태 변화

    • 계산 -> 상태 변화

    • 핫초코 재고 부족 -> 오류

    • 환불, 주문 폐기 -> rollback

  • 비지니스 흐름에 따라 기능을 수행하다가 중간에 문제가 발생할 수 있다. 문제가 발생한 시점에 rollback 또는 retry 를 수행한다.

  • 기존의 레거시 시스템에서 문제 발생시 일관된 commit 또는 rollback 처리나 이전에 발생한 상태 변경에 직접 접근해서 데이터 수정이 가능하다. 하지만 MSA 가 적용된 시스템에서 서로다른 서비스에 걸쳐진 기능을 수행하는 도중 일관된 commit 또는 rollback 을 수행할 수 없다. 이 때 EDM 을 적용해 rollback 또는 retry 를 처리할 수 있다.

  • rollback이 필요한 경우 Failed 이벤트를 발생시키고, 이를 이전 스텝을 수행한 서비스에서 구독하여 보관되어 있던 이벤트 로그 기반으로 rollback을 수행합니다. retry가 필요한 경우 메세지 큐의 requeue 또는 dead letter queue 기능을 사용해 retry 처리를 수행할 수 있습니다.

비동기 메세지 큐를 통한 시스템 내 통합(integration)

  • MSA 에서 내부 통신은 크게 2가지가 사용된다. 두가지 방식 모두 강점과 약점이 있다. 상황에 따라서 적합한 방식을 사용하면 된다.

    • REST 통신

    • 메세지 큐 통신

  • REST 통신은 실시간으로 보여줘야 하는 데이터를 모으는 등 조회 기능을 수행하기에 적합하다. 하지만 모든 내부 통신을 REST 로 수행할 경우 몇가지 문제점이 발생할 수 있다.

    • 서비스 간 의존성

      • 여러 서비스간 데이터 생성, 삭제, 변경이 얽혀있다면 어느 서비스에서 Client 의 응답을 받아서 누구에게 전달해 처리해야 하는지 모호하다.

      • 서비스가 추가된다면 해당 기능 수행에 연관있는 모든 어플리케이션에 수정이 필요할 수 있다. (결합도가 높아진다..)

    • 데이터 관리 매우 어려움

      • 서비스 간 분산 트랜잭션 처리 및 중간에 오류가 발생했을 때 복원 시점, 복원 키 값을 찾는 등에 어려움이 있다.

      • 서비스 간 반정규화 된 동일한 데이터를 변경할 때 요청 받은 서비스가 반정규화된 데이터가 위한 서비스를 모두 찾아서 변경하도록 처리해야 한다.

      • 데이터 오너 서비스가 반정규화 해간 서비스 리스트를 관리하지 않는 이상 그에 따른 데이터의 일관성을 유지하기가 어렵다.

    • 동기 통신의 비용

      • 외부에서 API 를 통해 요청이 전달되었을 때, 응답을 하기까지 연관된 모든 서비스의 자원을 홀딩한다.

  • 비동기 메세지 큐 방식은 시스템 내 통합에 적합하다.

    • 서비스 간 결합도가 낮아진다.

    • 서비스 흐름이 단순해진다.

    • 발행 서비스는 구독 서비스들을 고려할 필요 없이 데이터 생성, 변경, 삭제가 발생하면 이벤트를 발생시킨다.

    • 구독 서비스는 메세지 큐의 라우팅 룰에 따라 전달되는 이벤트를 구독해 자신만의 비지니스 로직을 수행한다.

    • 응답 지연시간이 줄어든다.

    • 실시간으로 처리 및 전달해야 하는 기능을 먼저 수행하고 나머지 후속동작은 메세지 큐를 통하게 적용한다면 응답 지연 시간을 낮출 수 있다.

... (여기서부터는모르는 내용이다..)

https://medium.com/dtevangelist/event-driven-microservice-%EB%9E%80-54b4eaf7cc4a