SlideShare a Scribd company logo
1 of 32
이벤트스토밍에서
스프링클라우드
구현까지
Open Cloud Engine
github.com/TheOpenCloudEngine
커머스 영역 예제
• 쇼핑몰 카탈로그 관리에서 주문, 재고
확인, 배송조회, 프로모션에 이르는 예
제
• MSA 적용 관심도가 가장 높은 영역중
하나
• 행사 제품과 특정 세일즈 기간에 특정
서비스가 핫-스폿으로 요청이 폭주하는
경향은 마이크로 서비스의 Self-
Healing, 결함내성, 동적 확장 등의
MSA 설계 강점을 잘 설명할 수 있음
• 챗봇을 통한 기존 고객에 대한 재방문
을 높히고 고객 성향 분석을 통한 추천
상품 제공
• MSA 플랫폼 상에 머신러닝 워크로드를
수행하는 Tensorflow, Keras 등의
Polyglot 한 다양한 플랫폼을 운영
Event Storming – Event 들을 먼저 도출
가입 탈퇴
비밀번호
분실
주문 결재완료
수취확인
입고
출고
우리 서비스에는 어떤 비즈니스 이벤트들이 발생하는가?
현업이 사용하는 용어를 그대로 사용 (Ubiquitous Language)
용어의 namespace 를 구지 나누려는 노력을 하지 않음
Event Storming – Command 도출
가입 탈퇴
비밀번호
분실
주문 결재완료
수취확인
입고
출고
가입화면
입력
탈퇴화면
비밀번호
분실화면
주문서
작성
PG결재
수취확인
버튼
Event를 발생시키는 명령은 무엇인가? UI를 통해? or 시간도래? or 다른 이벤트에 의해?
Event Storming – Entity 도출
가입 탈퇴
비밀번호
분실
주문 결재완료
수취확인
입고
출고
가입화면
입력
탈퇴화면
비밀번호
분실화면
주문서
작성
PG결재
수취확인
버튼
고객
• 이름
• 나이
• 성별
• 비밀번호
주문
• 주문번호
• 일시
• 제품정보
• 수량
• 배송상태
제고
• 제품정보
• 수량
Event Storming – Sub-domain 과
Bounded Context
가입 탈퇴
비밀번호
분실
주문 결재완료
수취확인
입고
출고
가입화면
입력
탈퇴화면
비밀번호
분실화면
주문서
작성
PG결재
수취확인
버튼
고객
• 이름
• 나이
• 성별
• 비밀번호
주문
• 주문번호
• 일시
• 제품정보
• 수량
• 배송상태
재고
• 제품정보
• 수량
Order
InventoryCustomer
Event Storming – Core / Supportive /
General Sub-domain
가입
탈퇴
주문 결재완료
입고
출고
가입화면
입력
탈퇴화면
비밀번호
분실화면
주문서
작성
PG결재
수취확인
버튼
입고입력
결재완료
사용자등록
비밀번호분
실처리
IAM (General)
Billing (Supportive)
구독일
도래
인보이
스발행
고객
• 이름
• 나이
• 성별
• 비밀번호
주문
• 주문번호
• 일시
• 제품정보
• 수량
• 배송상태
재고
• 제품정보
• 수량
수취확인
Order (Core)
Inventory
(Core)
Customer (Core)
로그발
생 수집
검증: 트랜잭션 검증 매트릭스*
Customer Order Inventory
고객 주문이력 입출고
이력
재고량
Customer 가입 CU
Order
주문 R C C U
취소 D C U
Inventory
입고 C U
출고 C U
8ACID Transaction Don’t care Eventual Transaction
Entities
Events
검증: 트랜잭션 유형 결정
9ACID Transaction Don’t care Eventual Transaction
• 이벤트의 발생 MS 와 Entity 접근의 CUD 가 완전히 동일한 MS
내에서만 벌어지면 ACID Transaction 가능
• 이벤트의 발생 MS 와 Entity 접근의 MS 가 R (read) 수준에서만
분산되어 벌어지면 값 참조 호출만으로 문제없음(don’t care)
• 이벤트의 발생 MS 와 Entity 접근의 MS 가 CUD 차원에서 걸쳐
지면 Eventual Transaction 비용 발생
Event Storming to DDD and
Implementations
가입 탈퇴
주문
결재완료
입고
출고
가입화면
입력
탈퇴화면비밀번호
분실화면
주문서
작성
PG결재 수취확인
버튼
입고입력
결재완료
사용자등록
비밀번호분
실처리
구독일
도래
인보이스
발행
고객 주문 재고
수취확인
Entities or Document DB
Business Events / Kafka Topics
UI or Service (REST API by Repository Pattern) or Batch Jobs
Decomposition to Micro Services
(Spring Boot Applications)
Customer
IAM
Order Inventory
Billing
Entity Class 와 Repository 작성
고객 주문 재고
public interface OrderRepository extends
MultitenantRepository<Order, java.lang.Long> {
}
@Entity
@Table(name="Ordertable")
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private java.lang.Long id;
private java.util.Date date;
private java.lang.String status;
@OneToMany(mappedBy="order")
private List<Item> itemList;
}
@Entity
@Multitenant
@TenantDiscriminatorColumn(
name = "TENANTID",
contextProperty = "tenant-id"
)
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
}
public interface CustomerRepository extends
MultitenantRepository<Customer, Long> {
List<Customer> findByLastName(String
lastName);
}
@Entity
@Table(name="Itemtable")
public class Item {
@Id @GeneratedValue(strategy=GenerationType.AUT
private java.lang.Long id;
private java.lang.String name;
private java.lang.Long stock;
@ManyToOne
private Order order;
}
public interface ItemRepository extends
MultitenantRepository<Item, java.lang.Long> {
}
Service 의 생성
주문서
작성
수취확인
버튼
Repository Pattern 으로 생성된 것
사용할 수 있는 경우
주문서 작성을 위한 백엔드 API 는
Order Repository 에서 생성된
CRUD actions 들 중 POST Service
를 그대로 사용할 수 있으므로 별
도 구현할 필요 없다. 마찬가지 주
문서 수정, 삭제도 각각 PATCH,
DELETE 로 생성된 API를 사용하면
된다.
Repository 에서 생성된 API 를 사용 못하
는 경우, 별도 Spring MVC Service 로 생성
수취 확인을 위한 백엔드 API 는 Order
Repository 에 생성된 PUT-POST-PATCH-
DELETE 중 적합한 것이 없으므로 별도 추
가 action URI를 만드는 것이 적합
@RequestMapping(method= RequestMethod.POST,
path="/orders/confirm-delivered")
public int confirmDelivered(Order order);
Domain Event 생성과 pub 처리
public class OrderPlacedEvent{
Order order;
}
#OrderPlacedEvent.java
주문
결재완료
결재완료
로그발생수취확인
@PostPersist
public void orderPlaced(){
messageChannel.send(MessageBuilder
.withPayload(new OrderPlacedEvent(this))
.build());
}
#Order.java
* 이벤트의 Publish trigger 는
주로 Entity 의 발생과 함께 하는 경우가 많음
Domain Event 의 sub 처리
Inventory 서비스 내부
주문
출고
Order (Core)
Inventory
(Core)
@StreamListener(Streams.INPUT)
public void handleOrder(@Payload OrderPlacedEvent orderPlacedEv
{
Item item = itemRepository.findOne(orderPlacedEvent.getItemId()
item.setStock(item.getStock()-1);
itemRepository.save(item);
}
Domain Event 의 sub 처리 II –
Marketing Service 의 등장
주문
출고
Order (Core) Inventory
(Core)
Marketing 서비스 내부
@StreamListener(Streams.INPUT)
public void handleOrder(@Payload OrderPlacedEvent
orderPlacedEvent) {
…. 고객 선호도 정보 저장 …
……. 유사 상품 추천 ……..
}
Marketing (Supportive)
주문
마케팅
정보
수집
• Least Coupling
• No Code Change in event
originator
• Don’t need to share database
(Store event data by each
microservices in preferred
format for their need)
Domain Event 의 sub 처리 III – Anti-
corruption Layer
주문
Order (Core)
Billing (Supportive)
Billing 서비스 내부
@StreamListener(Streams.INPUT)
public void handleOrder(@Payload MeteringLogEvent meteringEve
…. 빌링 처리 …
}
OrderPlacedEvent
Not compatible!
인보이스
발행
로그발생
Domain Event 의 sub 처리 III – Anti-
corruption Layer
주문
Anti-
Corruption
처리
Order (Core)
Order-Billing
(Anti-corruption)
Billing (Supportive)
인보이스
발행
Order-Billing 서비스 내부
@StreamListener(Streams.INPUT)
public void handleOrder(@Payload OrderPlacedEvent orderEvent
messageChannel.send(MessageBuilder
.withPayload(new MeteringLogEvent(orderEvent))
.build());
}
로그발생
• Anti-corruption Layer 를 위해 새로운
MS 를 또 관리하는 것이 부담이 되는
경우
• BPM 을 통해서 Anti-corruption Layer
를 위한 Micro service 를 그때 그때 생
성하고 폐기할 수 있음
• 마이크로 서비스간에 Glue 역할
방법2:
Class diagraming for each micro services
Class diagraming for each micro
services
Generate Micro services with Repository
Pattern
코드생성
Git 커밋
빌드 & 배포
서비스 접속 URL
고객
주문
재고
주문서
CRUD
고객
CRUD
재고
CRUD
Test the generated micro service –
Order Service
http http://backend-commerce-order-dev.pas-mini.io/items name="OO 건조기" stock=5
{
"_links": {
"item": {
"href": "http://backend-commerce-order-dev.pas-mini.io/items/1"
},
"order": {
"href": "http://backend-commerce-order-dev.pas-mini.io/items/1/order"
},
"self": {
"href": "http://backend-commerce-order-dev.pas-mini.io/items/1"
}
},
"name": "OO 건조기",
"stock": 5
}
Generated Code details –Spring Boot
on Spring Cloud MSA Chassis
Main Application
Domain Classes
Services and Repositories
Settings
방법1의 Entity-Repository 패
턴에 대한 작업을 대신해줌
BPMN-based Coordination
(Choreography)
= MS
= Pub
= Sub
Pros:
• Low-Code
• Manageable by Business Users
• Productivity
Cons:
• Hard-to-debug
• Fragile
마이크로서비스
에서의
분산 트랜잭션
Open Cloud Engine
github.com/TheOpenCloudEngine
전통적 Shared DB, ACID 트랜잭션
총구매액: 500 총마일리지: 5
총구매액: 600 총마일리지: 6
Consistent
In-consistent
조회화면서비스구성 (모놀로씩)
Order
(MySQL)
Client (Web/Mobile)
POST
Order
Milea
ge
총구매액: 700 총마일리지: 7
마이크로서비스화, 순차 호출
총구매액: 500 총마일리지: 5
총구매액: 600 총마일리지: 5
총구매액: 600 총마일리지: 6
총구매액: 700 총마일리지: 6
Consistent
In-consistent
조회화면서비스구성 (클라이언트가 순차 호출)
Mileage
(MongoDB)
Order
(MySQL)
Client (Web/Mobile)
POST (성공시) - POST
CQRS 를 통한 분산 트랜잭션 처리
총구매액: 500 총마일리지: 5
총구매액: 600 총마일리지: 5
총구매액: 600 총마일리지: 6
총구매액: 700 총마일리지: 6
총구매액: 700 총마일리지: 7
Consistent
In-consistent
조회화면서비스구성 (CQRS)
Mileage
(MongoDB)
Order
(MySQL)
Kafka (메시지보장)
OrderPlaced
(pub)
OrderPlaced
(sub)
Client (Web/Mobile)
POST
Update
여기서 선택의 길을 만남
• ‘잠깐의’ 데이터 불일치가 얼마나 크리티컬 한가?
• 크리티컬 하다고 응답한다면, 내 서비스의 성능과 확장
성에 비하여 크리티컬 한가?
• 성능과 확장성 보다 크리티컬 하다면, 성능과 확장성을
포기할 수 있는가?
• 성공한 내 서비스의 경쟁자들은 무엇을 포기했는가?
•  강력한 의사결정 필요
CQRS 를 통한 분산 트랜잭션 처리 – 불
일치가 Mission Critical 한 경우
총구매액: 500 총마일리지: 5
총구매액: 600 총마일리지: 5 (PENDING)
총구매액: 600 총마일리지: 6
총구매액: 700 총마일리지: 6 (PENDING)
총구매액: 700 총마일리지: 7
Consistent
In-consistent
조회화면서비스구성 (CQRS)
Mileage
(MongoDB)
Order
(MySQL)
Kafka
OrderPlaced
(pub, PENDING)
OrderPlaced
(sub)
Client (Web/Mobile)
POST
All-done
(pub)
All-done
(sub, CLEAR PENDING)
CQRS 를 통한 분산 트랜잭션 처리 –
Rollback (Saga Pattern)
총구매액: 500 총마일리지: 5
총구매액: 600 총마일리지: 5 (PENDING)
총구매액: 600 총마일리지: 6
총구매액: 700 총마일리지: 6 (PENDING)
총구매액: 700 총마일리지: 7  실패
Consistent
In-consistent
조회화면서비스구성 (CQRS)
Mileage
(MongoDB)
Order
(MySQL)
Kafka
OrderPlaced
(pub, PENDING)
OrderPlaced
(sub)
Client (Web/Mobile)
POST
All-done
(pub)
FAILED
(sub, DELETE or CANCEL)
FAILED
(pub)
If~else
총구매액: 600 총마일리지: 6
BPMN 을 이용한 CQRS와 Sagas
https://www.infoq.com/articles/events-workflow-automation

More Related Content

What's hot

Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
Amazon Web Services Korea
 

What's hot (20)

비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
 
Microservice coding guide
Microservice coding guideMicroservice coding guide
Microservice coding guide
 
Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos
 
Process Oriented Architecture
Process Oriented ArchitectureProcess Oriented Architecture
Process Oriented Architecture
 
Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...
Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...
Atlassian 트러블슈팅 및 가상화기반 Confluence Data Center 구축 - 오픈소스...
 
AI = SE , giip system manage automation with A.I
AI = SE , giip system manage automation with A.IAI = SE , giip system manage automation with A.I
AI = SE , giip system manage automation with A.I
 
AWS Finance Symposium_천만 고객을 위한 AWS 클라우드 아키텍쳐 확장하기
AWS Finance Symposium_천만 고객을 위한 AWS 클라우드 아키텍쳐 확장하기AWS Finance Symposium_천만 고객을 위한 AWS 클라우드 아키텍쳐 확장하기
AWS Finance Symposium_천만 고객을 위한 AWS 클라우드 아키텍쳐 확장하기
 
[Partner TechForum] 금융 서비스를 위한 블록체인 구축사례 소개
[Partner TechForum] 금융 서비스를 위한 블록체인 구축사례 소개[Partner TechForum] 금융 서비스를 위한 블록체인 구축사례 소개
[Partner TechForum] 금융 서비스를 위한 블록체인 구축사례 소개
 
[Atlassian meets dev ops and itsm] infrastructure for devops
[Atlassian meets dev ops and itsm] infrastructure for devops[Atlassian meets dev ops and itsm] infrastructure for devops
[Atlassian meets dev ops and itsm] infrastructure for devops
 
Giip bp-giip connectivity1703
Giip bp-giip connectivity1703Giip bp-giip connectivity1703
Giip bp-giip connectivity1703
 
Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
Data Center to Cloud - AWS 마이그레이션 자동화 방법 및 도구 - AWS Summit Seoul 2017
 
DB innovation conference 2020
DB innovation conference 2020DB innovation conference 2020
DB innovation conference 2020
 
AWS 12월 웨비나 │성공적인 마이그레이션을 위한 클라우드 아키텍처 및 운영 고도화
AWS 12월 웨비나 │성공적인 마이그레이션을 위한 클라우드 아키텍처 및 운영 고도화AWS 12월 웨비나 │성공적인 마이그레이션을 위한 클라우드 아키텍처 및 운영 고도화
AWS 12월 웨비나 │성공적인 마이그레이션을 위한 클라우드 아키텍처 및 운영 고도화
 
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Ladybug - 멀티클라우드 애플리케이션 서비스 통합 운용 및 관리 (Integr...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Ladybug - 멀티클라우드 애플리케이션 서비스 통합 운용 및 관리 (Integr...Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Ladybug - 멀티클라우드 애플리케이션 서비스 통합 운용 및 관리 (Integr...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Ladybug - 멀티클라우드 애플리케이션 서비스 통합 운용 및 관리 (Integr...
 
AWS Finance Symposium_금융사와 핀테크 협력 사례
AWS Finance Symposium_금융사와 핀테크 협력 사례   AWS Finance Symposium_금융사와 핀테크 협력 사례
AWS Finance Symposium_금융사와 핀테크 협력 사례
 
4시간 안에 끝내는 AWS 클라우드 전환 및 운영 환경 구성_최지웅_오픈소스컨설팅
4시간 안에 끝내는 AWS 클라우드 전환 및 운영 환경 구성_최지웅_오픈소스컨설팅4시간 안에 끝내는 AWS 클라우드 전환 및 운영 환경 구성_최지웅_오픈소스컨설팅
4시간 안에 끝내는 AWS 클라우드 전환 및 운영 환경 구성_최지웅_오픈소스컨설팅
 
모바일 개발 트랜드
모바일 개발 트랜드모바일 개발 트랜드
모바일 개발 트랜드
 
클라우드 이야기2 2 20160824-신인철_slideshare
클라우드 이야기2 2 20160824-신인철_slideshare클라우드 이야기2 2 20160824-신인철_slideshare
클라우드 이야기2 2 20160824-신인철_slideshare
 
[giip] A.I. Infrastructure Advisor (인공지능 인프라 어드바이저)
[giip] A.I. Infrastructure Advisor (인공지능 인프라 어드바이저)[giip] A.I. Infrastructure Advisor (인공지능 인프라 어드바이저)
[giip] A.I. Infrastructure Advisor (인공지능 인프라 어드바이저)
 
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
주 52시간 시대의 Agile_ 오픈소스컨설팅 한진규 이사
 

Similar to From event storming to spring cloud implementation

[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
Sang Don Kim
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
문기 박
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
LGU+
 

Similar to From event storming to spring cloud implementation (20)

[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
 
Service-Oriented Architecture in a Nutshell
Service-Oriented Architecture in a NutshellService-Oriented Architecture in a Nutshell
Service-Oriented Architecture in a Nutshell
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
스마트 팩토리: AWS 사물인터넷과 인공지능을 활용한 스마트 팩토리 구축 – 최영준 AWS 솔루션즈 아키텍트, 정현아 AWS 솔루션즈 아키...
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
분산 트랜잭션 환경에서 데이터 일관성 유지 방안 업로드용
 
이제 온라인이다! 브라우저 안으로 들어온 Visual studio!
이제 온라인이다! 브라우저 안으로 들어온 Visual studio!이제 온라인이다! 브라우저 안으로 들어온 Visual studio!
이제 온라인이다! 브라우저 안으로 들어온 Visual studio!
 
AWS 와 함께하는 클라우드 컴퓨팅:: 방희란 :: AWS Summit Seoul 2016
AWS 와 함께하는 클라우드 컴퓨팅:: 방희란 :: AWS Summit Seoul 2016AWS 와 함께하는 클라우드 컴퓨팅:: 방희란 :: AWS Summit Seoul 2016
AWS 와 함께하는 클라우드 컴퓨팅:: 방희란 :: AWS Summit Seoul 2016
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
[Partner TechShift 2017] AWS로 당신의 소프트웨어를 혁신하라
[Partner TechShift 2017] AWS로 당신의 소프트웨어를 혁신하라[Partner TechShift 2017] AWS로 당신의 소프트웨어를 혁신하라
[Partner TechShift 2017] AWS로 당신의 소프트웨어를 혁신하라
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
 
All about Data Center Migration Session 1. <Case Study> 오비맥주 사례로 알아보는 DC 마이그레...
All about Data Center Migration Session 1. <Case Study> 오비맥주 사례로 알아보는 DC 마이그레...All about Data Center Migration Session 1. <Case Study> 오비맥주 사례로 알아보는 DC 마이그레...
All about Data Center Migration Session 1. <Case Study> 오비맥주 사례로 알아보는 DC 마이그레...
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
AWS와 함께하는 스타트업의 성장곡선 (윤석찬)- 클라우드 태권 2015
AWS와 함께하는 스타트업의 성장곡선 (윤석찬)- 클라우드 태권 2015AWS와 함께하는 스타트업의 성장곡선 (윤석찬)- 클라우드 태권 2015
AWS와 함께하는 스타트업의 성장곡선 (윤석찬)- 클라우드 태권 2015
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
 
클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션 :: 정우진 이사
클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션 :: 정우진 이사클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션 :: 정우진 이사
클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션 :: 정우진 이사
 
170426 cloud day in 포항 2. 클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션_aws 정우진 이사
170426 cloud day in 포항 2. 클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션_aws 정우진 이사170426 cloud day in 포항 2. 클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션_aws 정우진 이사
170426 cloud day in 포항 2. 클라우드 뉴노멀 시대의 글로벌 혁신 기업들의 디지털 트랜스포메이션_aws 정우진 이사
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
MSA 전략 2: 마이크로서비스, 어떻게 구현할 것인가?
MSA 전략 2: 마이크로서비스, 어떻게 구현할 것인가?MSA 전략 2: 마이크로서비스, 어떻게 구현할 것인가?
MSA 전략 2: 마이크로서비스, 어떻게 구현할 것인가?
 

More from uEngine Solutions

More from uEngine Solutions (18)

이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
 
Safe cloud native transformation approaches
Safe cloud native transformation approachesSafe cloud native transformation approaches
Safe cloud native transformation approaches
 
microservice architecture public education v2
microservice architecture public education v2microservice architecture public education v2
microservice architecture public education v2
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
 
Open Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsOpen Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS Snapshots
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례
 
Building multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickBuilding multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quick
 
Building multi tenancy enterprise applications
Building multi tenancy enterprise applicationsBuilding multi tenancy enterprise applications
Building multi tenancy enterprise applications
 
Metaworks4 intro
Metaworks4 introMetaworks4 intro
Metaworks4 intro
 
아키텍트대회 유엔진-장진영-Sw공학표준을 기반한 alm
아키텍트대회 유엔진-장진영-Sw공학표준을 기반한 alm아키텍트대회 유엔진-장진영-Sw공학표준을 기반한 alm
아키텍트대회 유엔진-장진영-Sw공학표준을 기반한 alm
 
Essencia 2017
Essencia 2017Essencia 2017
Essencia 2017
 
성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택
 
9 design factors for cloud applications
9 design factors for cloud applications9 design factors for cloud applications
9 design factors for cloud applications
 
Front-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and PolymerFront-end architecture for cloud applications and Polymer
Front-end architecture for cloud applications and Polymer
 
객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강
 
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석Open source apm scouter를 통한 관제  관리 jadecross 정환열 수석
Open source apm scouter를 통한 관제 관리 jadecross 정환열 수석
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
 
Io t에서 big data를 통합하는 통합 빅데이터 플랫폼 flamingo_클라우다인_김병곤 대표이사
Io t에서 big data를 통합하는 통합 빅데이터 플랫폼 flamingo_클라우다인_김병곤 대표이사Io t에서 big data를 통합하는 통합 빅데이터 플랫폼 flamingo_클라우다인_김병곤 대표이사
Io t에서 big data를 통합하는 통합 빅데이터 플랫폼 flamingo_클라우다인_김병곤 대표이사
 

From event storming to spring cloud implementation

  • 2. 커머스 영역 예제 • 쇼핑몰 카탈로그 관리에서 주문, 재고 확인, 배송조회, 프로모션에 이르는 예 제 • MSA 적용 관심도가 가장 높은 영역중 하나 • 행사 제품과 특정 세일즈 기간에 특정 서비스가 핫-스폿으로 요청이 폭주하는 경향은 마이크로 서비스의 Self- Healing, 결함내성, 동적 확장 등의 MSA 설계 강점을 잘 설명할 수 있음 • 챗봇을 통한 기존 고객에 대한 재방문 을 높히고 고객 성향 분석을 통한 추천 상품 제공 • MSA 플랫폼 상에 머신러닝 워크로드를 수행하는 Tensorflow, Keras 등의 Polyglot 한 다양한 플랫폼을 운영
  • 3. Event Storming – Event 들을 먼저 도출 가입 탈퇴 비밀번호 분실 주문 결재완료 수취확인 입고 출고 우리 서비스에는 어떤 비즈니스 이벤트들이 발생하는가? 현업이 사용하는 용어를 그대로 사용 (Ubiquitous Language) 용어의 namespace 를 구지 나누려는 노력을 하지 않음
  • 4. Event Storming – Command 도출 가입 탈퇴 비밀번호 분실 주문 결재완료 수취확인 입고 출고 가입화면 입력 탈퇴화면 비밀번호 분실화면 주문서 작성 PG결재 수취확인 버튼 Event를 발생시키는 명령은 무엇인가? UI를 통해? or 시간도래? or 다른 이벤트에 의해?
  • 5. Event Storming – Entity 도출 가입 탈퇴 비밀번호 분실 주문 결재완료 수취확인 입고 출고 가입화면 입력 탈퇴화면 비밀번호 분실화면 주문서 작성 PG결재 수취확인 버튼 고객 • 이름 • 나이 • 성별 • 비밀번호 주문 • 주문번호 • 일시 • 제품정보 • 수량 • 배송상태 제고 • 제품정보 • 수량
  • 6. Event Storming – Sub-domain 과 Bounded Context 가입 탈퇴 비밀번호 분실 주문 결재완료 수취확인 입고 출고 가입화면 입력 탈퇴화면 비밀번호 분실화면 주문서 작성 PG결재 수취확인 버튼 고객 • 이름 • 나이 • 성별 • 비밀번호 주문 • 주문번호 • 일시 • 제품정보 • 수량 • 배송상태 재고 • 제품정보 • 수량 Order InventoryCustomer
  • 7. Event Storming – Core / Supportive / General Sub-domain 가입 탈퇴 주문 결재완료 입고 출고 가입화면 입력 탈퇴화면 비밀번호 분실화면 주문서 작성 PG결재 수취확인 버튼 입고입력 결재완료 사용자등록 비밀번호분 실처리 IAM (General) Billing (Supportive) 구독일 도래 인보이 스발행 고객 • 이름 • 나이 • 성별 • 비밀번호 주문 • 주문번호 • 일시 • 제품정보 • 수량 • 배송상태 재고 • 제품정보 • 수량 수취확인 Order (Core) Inventory (Core) Customer (Core) 로그발 생 수집
  • 8. 검증: 트랜잭션 검증 매트릭스* Customer Order Inventory 고객 주문이력 입출고 이력 재고량 Customer 가입 CU Order 주문 R C C U 취소 D C U Inventory 입고 C U 출고 C U 8ACID Transaction Don’t care Eventual Transaction Entities Events
  • 9. 검증: 트랜잭션 유형 결정 9ACID Transaction Don’t care Eventual Transaction • 이벤트의 발생 MS 와 Entity 접근의 CUD 가 완전히 동일한 MS 내에서만 벌어지면 ACID Transaction 가능 • 이벤트의 발생 MS 와 Entity 접근의 MS 가 R (read) 수준에서만 분산되어 벌어지면 값 참조 호출만으로 문제없음(don’t care) • 이벤트의 발생 MS 와 Entity 접근의 MS 가 CUD 차원에서 걸쳐 지면 Eventual Transaction 비용 발생
  • 10. Event Storming to DDD and Implementations 가입 탈퇴 주문 결재완료 입고 출고 가입화면 입력 탈퇴화면비밀번호 분실화면 주문서 작성 PG결재 수취확인 버튼 입고입력 결재완료 사용자등록 비밀번호분 실처리 구독일 도래 인보이스 발행 고객 주문 재고 수취확인 Entities or Document DB Business Events / Kafka Topics UI or Service (REST API by Repository Pattern) or Batch Jobs
  • 11. Decomposition to Micro Services (Spring Boot Applications) Customer IAM Order Inventory Billing
  • 12. Entity Class 와 Repository 작성 고객 주문 재고 public interface OrderRepository extends MultitenantRepository<Order, java.lang.Long> { } @Entity @Table(name="Ordertable") public class Order { @Id @GeneratedValue(strategy=GenerationType.AUTO) private java.lang.Long id; private java.util.Date date; private java.lang.String status; @OneToMany(mappedBy="order") private List<Item> itemList; } @Entity @Multitenant @TenantDiscriminatorColumn( name = "TENANTID", contextProperty = "tenant-id" ) public class Customer { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String firstName; private String lastName; } public interface CustomerRepository extends MultitenantRepository<Customer, Long> { List<Customer> findByLastName(String lastName); } @Entity @Table(name="Itemtable") public class Item { @Id @GeneratedValue(strategy=GenerationType.AUT private java.lang.Long id; private java.lang.String name; private java.lang.Long stock; @ManyToOne private Order order; } public interface ItemRepository extends MultitenantRepository<Item, java.lang.Long> { }
  • 13. Service 의 생성 주문서 작성 수취확인 버튼 Repository Pattern 으로 생성된 것 사용할 수 있는 경우 주문서 작성을 위한 백엔드 API 는 Order Repository 에서 생성된 CRUD actions 들 중 POST Service 를 그대로 사용할 수 있으므로 별 도 구현할 필요 없다. 마찬가지 주 문서 수정, 삭제도 각각 PATCH, DELETE 로 생성된 API를 사용하면 된다. Repository 에서 생성된 API 를 사용 못하 는 경우, 별도 Spring MVC Service 로 생성 수취 확인을 위한 백엔드 API 는 Order Repository 에 생성된 PUT-POST-PATCH- DELETE 중 적합한 것이 없으므로 별도 추 가 action URI를 만드는 것이 적합 @RequestMapping(method= RequestMethod.POST, path="/orders/confirm-delivered") public int confirmDelivered(Order order);
  • 14. Domain Event 생성과 pub 처리 public class OrderPlacedEvent{ Order order; } #OrderPlacedEvent.java 주문 결재완료 결재완료 로그발생수취확인 @PostPersist public void orderPlaced(){ messageChannel.send(MessageBuilder .withPayload(new OrderPlacedEvent(this)) .build()); } #Order.java * 이벤트의 Publish trigger 는 주로 Entity 의 발생과 함께 하는 경우가 많음
  • 15. Domain Event 의 sub 처리 Inventory 서비스 내부 주문 출고 Order (Core) Inventory (Core) @StreamListener(Streams.INPUT) public void handleOrder(@Payload OrderPlacedEvent orderPlacedEv { Item item = itemRepository.findOne(orderPlacedEvent.getItemId() item.setStock(item.getStock()-1); itemRepository.save(item); }
  • 16. Domain Event 의 sub 처리 II – Marketing Service 의 등장 주문 출고 Order (Core) Inventory (Core) Marketing 서비스 내부 @StreamListener(Streams.INPUT) public void handleOrder(@Payload OrderPlacedEvent orderPlacedEvent) { …. 고객 선호도 정보 저장 … ……. 유사 상품 추천 …….. } Marketing (Supportive) 주문 마케팅 정보 수집 • Least Coupling • No Code Change in event originator • Don’t need to share database (Store event data by each microservices in preferred format for their need)
  • 17. Domain Event 의 sub 처리 III – Anti- corruption Layer 주문 Order (Core) Billing (Supportive) Billing 서비스 내부 @StreamListener(Streams.INPUT) public void handleOrder(@Payload MeteringLogEvent meteringEve …. 빌링 처리 … } OrderPlacedEvent Not compatible! 인보이스 발행 로그발생
  • 18. Domain Event 의 sub 처리 III – Anti- corruption Layer 주문 Anti- Corruption 처리 Order (Core) Order-Billing (Anti-corruption) Billing (Supportive) 인보이스 발행 Order-Billing 서비스 내부 @StreamListener(Streams.INPUT) public void handleOrder(@Payload OrderPlacedEvent orderEvent messageChannel.send(MessageBuilder .withPayload(new MeteringLogEvent(orderEvent)) .build()); } 로그발생 • Anti-corruption Layer 를 위해 새로운 MS 를 또 관리하는 것이 부담이 되는 경우 • BPM 을 통해서 Anti-corruption Layer 를 위한 Micro service 를 그때 그때 생 성하고 폐기할 수 있음 • 마이크로 서비스간에 Glue 역할
  • 19. 방법2: Class diagraming for each micro services
  • 20. Class diagraming for each micro services
  • 21. Generate Micro services with Repository Pattern 코드생성 Git 커밋 빌드 & 배포 서비스 접속 URL 고객 주문 재고 주문서 CRUD 고객 CRUD 재고 CRUD
  • 22. Test the generated micro service – Order Service http http://backend-commerce-order-dev.pas-mini.io/items name="OO 건조기" stock=5 { "_links": { "item": { "href": "http://backend-commerce-order-dev.pas-mini.io/items/1" }, "order": { "href": "http://backend-commerce-order-dev.pas-mini.io/items/1/order" }, "self": { "href": "http://backend-commerce-order-dev.pas-mini.io/items/1" } }, "name": "OO 건조기", "stock": 5 }
  • 23. Generated Code details –Spring Boot on Spring Cloud MSA Chassis Main Application Domain Classes Services and Repositories Settings 방법1의 Entity-Repository 패 턴에 대한 작업을 대신해줌
  • 24. BPMN-based Coordination (Choreography) = MS = Pub = Sub Pros: • Low-Code • Manageable by Business Users • Productivity Cons: • Hard-to-debug • Fragile
  • 26. 전통적 Shared DB, ACID 트랜잭션 총구매액: 500 총마일리지: 5 총구매액: 600 총마일리지: 6 Consistent In-consistent 조회화면서비스구성 (모놀로씩) Order (MySQL) Client (Web/Mobile) POST Order Milea ge 총구매액: 700 총마일리지: 7
  • 27. 마이크로서비스화, 순차 호출 총구매액: 500 총마일리지: 5 총구매액: 600 총마일리지: 5 총구매액: 600 총마일리지: 6 총구매액: 700 총마일리지: 6 Consistent In-consistent 조회화면서비스구성 (클라이언트가 순차 호출) Mileage (MongoDB) Order (MySQL) Client (Web/Mobile) POST (성공시) - POST
  • 28. CQRS 를 통한 분산 트랜잭션 처리 총구매액: 500 총마일리지: 5 총구매액: 600 총마일리지: 5 총구매액: 600 총마일리지: 6 총구매액: 700 총마일리지: 6 총구매액: 700 총마일리지: 7 Consistent In-consistent 조회화면서비스구성 (CQRS) Mileage (MongoDB) Order (MySQL) Kafka (메시지보장) OrderPlaced (pub) OrderPlaced (sub) Client (Web/Mobile) POST Update
  • 29. 여기서 선택의 길을 만남 • ‘잠깐의’ 데이터 불일치가 얼마나 크리티컬 한가? • 크리티컬 하다고 응답한다면, 내 서비스의 성능과 확장 성에 비하여 크리티컬 한가? • 성능과 확장성 보다 크리티컬 하다면, 성능과 확장성을 포기할 수 있는가? • 성공한 내 서비스의 경쟁자들은 무엇을 포기했는가? •  강력한 의사결정 필요
  • 30. CQRS 를 통한 분산 트랜잭션 처리 – 불 일치가 Mission Critical 한 경우 총구매액: 500 총마일리지: 5 총구매액: 600 총마일리지: 5 (PENDING) 총구매액: 600 총마일리지: 6 총구매액: 700 총마일리지: 6 (PENDING) 총구매액: 700 총마일리지: 7 Consistent In-consistent 조회화면서비스구성 (CQRS) Mileage (MongoDB) Order (MySQL) Kafka OrderPlaced (pub, PENDING) OrderPlaced (sub) Client (Web/Mobile) POST All-done (pub) All-done (sub, CLEAR PENDING)
  • 31. CQRS 를 통한 분산 트랜잭션 처리 – Rollback (Saga Pattern) 총구매액: 500 총마일리지: 5 총구매액: 600 총마일리지: 5 (PENDING) 총구매액: 600 총마일리지: 6 총구매액: 700 총마일리지: 6 (PENDING) 총구매액: 700 총마일리지: 7  실패 Consistent In-consistent 조회화면서비스구성 (CQRS) Mileage (MongoDB) Order (MySQL) Kafka OrderPlaced (pub, PENDING) OrderPlaced (sub) Client (Web/Mobile) POST All-done (pub) FAILED (sub, DELETE or CANCEL) FAILED (pub) If~else 총구매액: 600 총마일리지: 6
  • 32. BPMN 을 이용한 CQRS와 Sagas https://www.infoq.com/articles/events-workflow-automation