MSA(MicroServiceArchitecture)
작은 자율 서비스 컬렉션, 각 서비스는 독립적이며 제한된 컨텍스트 내에서 단일 비즈니스 기능을 구현

SQL Server Agent
SQL Server를 사용하여 작업 정보를 저장
- 특정 이벤트 또는 요청 시 일정에 따라 작업을 실행
Service Broker
비동기 메시지 처리 기능을 구현
- 기본 데이터베이스 내 서비스 지향 애플리케이션을 만들 수 있는 메시지 배달 프레임워크
- 메시지를 교환하는 데이터베이스 서비스
- 모든 서비스에는 메시지가 치리될 때까지 배치되는 큐가 존재

Event Driven MicroService(EDM)
Event Driven이란?

Event Driven 아키텍처는 특정 서비스에서 다른 서비스가 관심을 가질 수 있는 일부 작업을 수행할 때 해당 서비스는 이벤트(작업의 기록)을 생성
- 다른 서비스는 이벤트들을 전달 받고 필요시 자체 작업 수행 가능
- REST와 달리 이벤트를 통해 느슨한 구조로 요청을 생성하는 서비스는 요청을 소비하는 서비스의 세부정보를 알 필요가 없다.
Event Bus(Store)
발행-구독(Pub-Sub) 메시지 모델
Queue처리 방식으로는 대표적으로 ActiveMQ, RabbitMQ가 있고 메시지 모델로는 대표적으로 Apache Kafka를 활용

Apache Kafka는 Event Driven 아키텍처에 사용되어 라우팅을 통한 “발행-구독” 메시지 스트리밍에서 데이터를 메시지 저장소에 넣습니다.
이벤트 데이터는 추가 처리 및 분석을 위해 분석 플랫폼인 Storm/Spark을 통해 SQL-NoSQL 데이터베이스에 저장할 수 있습니다.
Message Queue
프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법
pub/sub

- publisher(게시자) : message를 생성해 topic에 전달하는 서버
- message(메세지) : publisher로부터 subscriber에게 최종적으로 전달되는 데이터와 속성의 조합
- topic(토픽) : publisher가 메세지를 전달하는 리소스
- subscription(구독) : 특정 단일 주제의 메시지 스트림이 구독 애프릴케이션으로 전달되는 과정을 나타내는 리소스
- subscriber(구독자) : 메세지를 수신하는 서버
RabbitMQ
AMQP를 구현한 오픈소스 메세지 브로커
프로그램끼리 안전하게 데이터를 주고받게 중간에서 연결해주는 역할
엔터프라이즈 서비스 버스(ESB) - Enterprise Service Bus
서로 다른 애플리케이션 간의 실시간 데이터 교환을 지원하는 소프트웨어 아키텍처 패턴
엔드포인트
ESB의 진입점 또는 출구점으로 간주 가능
- 각 엔드포인트에는 일반적으로 고유한 주소 또는 식별자가 있다.
- XML, JSON 또는 바이너리 데이터와 같은 다양한 메시지 유형 처리 가능
어댑터
다양한 형식과 프로토콜 간에 메시지를 변환
- 메시지 로깅, 모니터링, 인증 및 오류 처리와 같은 기능을 제공
버스
엔드포인트 간 메시지 교환을 위한 핵심 구성 요소
- 매사자 유형, 내용 또는 대상과 같은 다양한 기준을 기반으로 하는 일련의 규칙 또는 정책을 사용하여 메시지를 라우팅
동작원리
- 버스는 한 엔드포인트에서 메시지를 수신
- 비즈니스 정책 규칙을 확인하여 대상 엔드포인트의 주소로 결정
- 메시지를 처리하여 대상 엔드포인트로 송신
SAGA 분산 트랜잭션 패턴
여러 서비스에서 트랜잭션을 조정하여 분산 시스템에서 데이터 일관성을 유지
- 각 서비스가 작업을 수행하고 이벤트 또는 메시지를 통해 다음 단계를 시작하는 로컬 트랜잭션의 시퀀스
- 시퀀스의 단계가 실패하면 SAGA는 완료된 단계를 실행 취소하기 위해 보상 트랜잭션을 수행

트랜잭션
ACID의 원칙을 준수해야함
- 원자성 : 모든 작업이 성공하거나 작업이 성공하지 않습니다.
- 일관성 : 데이터가 유효한 상태에서 다른 유효한 상태로 전환됩니다.
- 격리 : 동시 트랜잭션은 순차 트랜잭션과 동일한 결과를 생성합니다.
- 내구성 : 변경 내용은 커밋된 후에도 오류가 발생하는 경우에도 유지됩니다.
Choreography
중앙 집중식 컨트롤러 없이 이벤트를 교환
- 각 로컬 트랜잭션은 안무를 사용하여 다른 서비스에서 로컬 트랜잭션을 트리거하는 도메인 이벤트를 게시

Orchestration
중앙 집중식 컨트롤러 또는 오케스트레이터는 모든 트랜잭션을 처리하고 이벤트에 따라 수행할 작업을 참가자에게 알려줍니다.
- SAGA 요청을 수행하고 각 작업의 상태를 저장 및 해석하며 보상 트랜잭션을 사용하여 오류를 복구 처리

CQRS(명령 쿼리 책임 분리)
데이터 저장소에 대한 읽기 및 쓰기 작업을 별도의 데이터 모델로 분리하는 디자인 패턴
- 명령측과 쿼리측의 두 부분으로 분할
- 명령측 : create, update, delete
- 쿼리측 : 읽기 전용 복제본을 사용하여 query 부분을 실행

- 비즈니스는 API를 통해 명령을 전송하여 애플리케이션과 상호 작용(데이터 생성, 업데이트 또는 삭제)
- 애플리케이션은 명령 측에서 수신 명령을 처리(작업 검증, 권한 부여및 실행 등)
- 애플리케이션은 명령의 데이터를 쓰기(명령) 데이터베이스에 유지
- 명령이 쓰기 데이터베이스에 저장되면 이벤트가 트리거되어 읽기(쿼리) 데이터베이스의 데이터를 업데이트
- 읽기(쿼리) 데이터베이스는 데이터를 처리하고 유지합니다. 읽기 데이터베이스는 특정 쿼리 요구사항에 맞게 최적화되도록 설계
- 비즈니스는 읽기 APIs와 상호 작용하여 애플리케이션의 쿼리 측으로 쿼리를 보냄
- 애플리케이션은 쿼리 측에서 수신 쿼리를 처리하고 읽기 데이터베이스에서 데이터를 검색