2020-04-19 12:50:31 +09:00
2020-04-18 13:27:19 +09:00
2020-04-18 13:27:19 +09:00
2020-04-19 12:50:31 +09:00

MSA/DDD/Event Storming 예제 - 음식배달

서비스 시나리오

이벤트 스토밍 결과:

http://msaez.io/#/storming/nZJ2QhwVc4NlVJPbtTkZ8x9jclF2/every/a77281d704710b0c2e6a823b6e6d973a/-M5AV2z--su_i4BfQfeF

과정 소개:

구현:

폴리글랏 퍼시스턴스 / 플랫폼

cd 주문
mvn spring-boot:run  # H2
cd 결제
mvn spring-boot:run  # H2
cd 상점
mvn spring-boot:run  # MySQL 
cd 마케팅
python marketing  # 파이썬

비동기식 호출 / 시간적 디커플링 / 장애격리 / 최종 (Eventual) 일관성 테스트

#상점 서비스를 잠시 내려놓음
kill (lsof -i )

#주문처리
http localhost:8080/주문s 품목=통닭 수량=1 주소=서울
http localhost:8080/주문s 품목=피자 수량=2 주소=서울

#주문상태 확인
http localhost:8080/주문s     # 주문상태 안바뀜 확인

#상점 서비스 기동
cd 상점
mvn spring-boot:run

#주문상태 확인
http localhost:8080/주문s     # 모든 주문의 상태가 배송됨으로 확인

동기식 호출 / 타임 커플링 / 결제 안되면 주문도 안됨

# 결제 서비스를 잠시 내려놓음
kill (lsof -i)

#주문처리
http localhost:8080/주문s 품목=통닭 수량=1 주소=서울    #오류
http localhost:8080/주문s 품목=피자 수량=2 주소=서울    #오류

#결제서비스 재기동
cd 결제
mvn spring-boot:run

#주문처리
http localhost:8080/주문s 품목=통닭 수량=1 주소=서울    #성공
http localhost:8080/주문s 품목=피자 수량=2 주소=서울    #성공

운영

동기식 호출 / 서킷 브레이킹 / 장애격``

부하테스트를 통한 서킷 브레이커 동작 확인:
- 동시사용자 100명
- 60초 동안 실시

$ siege -c100 -t60S -r10 --content-type "application/json" 'http://localhost:8081/orders POST {"item": "chicken"}'

** SIEGE 4.0.5 ** Preparing 100 concurrent users for battle. The server is now under siege...

HTTP/1.1 201 0.68 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.68 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.70 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.70 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.73 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.75 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.77 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.97 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.81 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 0.87 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.12 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.16 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.17 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.26 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.25 secs: 207 bytes ==> POST http://localhost:8081/orders

  • 요청이 과도하여 CB를 동작함 요청을 차단

HTTP/1.1 500 1.29 secs: 248 bytes ==> POST http://localhost:8081/orders
HTTP/1.1 500 1.24 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 1.23 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 1.42 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 2.08 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.29 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 1.24 secs: 248 bytes ==> POST http://localhost:8081/orders

  • 요청을 어느정도 돌려보내고나니, 기존에 밀린 일들이 처리되었고, 회로를 닫아 요청을 다시 받기 시작

HTTP/1.1 201 1.46 secs: 207 bytes ==> POST http://localhost:8081/orders
HTTP/1.1 201 1.33 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.36 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.63 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.65 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.68 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.69 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.71 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.71 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.74 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.76 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 1.79 secs: 207 bytes ==> POST http://localhost:8081/orders

  • 다시 요청이 쌓이기 시작하여 건당 처리시간이 610 밀리를 살짝 넘기기 시작 => 회로 열기 => 요청 실패처리

HTTP/1.1 500 1.93 secs: 248 bytes ==> POST http://localhost:8081/orders
HTTP/1.1 500 1.92 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 1.93 secs: 248 bytes ==> POST http://localhost:8081/orders

  • 생각보다 빨리 상태 호전됨 - (건당 (쓰레드당) 처리시간이 610 밀리 미만으로 회복) => 요청 수락

HTTP/1.1 201 2.24 secs: 207 bytes ==> POST http://localhost:8081/orders
HTTP/1.1 201 2.32 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.16 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.19 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.19 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.19 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.21 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.29 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.30 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.38 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.59 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.61 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.62 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 2.64 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.01 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.27 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.33 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.45 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.52 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.57 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.69 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.70 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.69 secs: 207 bytes ==> POST http://localhost:8081/orders

  • 이후 이러한 패턴이 계속 반복되면서 시스템은 도미노 현상이나 자원 소모의 폭주 없이 잘 운영됨

HTTP/1.1 500 4.76 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.23 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.76 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.74 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.82 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.82 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.84 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.66 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 5.03 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.22 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.19 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.18 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.69 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.65 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 5.13 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.84 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.25 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.25 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.80 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.87 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.33 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.86 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.96 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.34 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 500 4.04 secs: 248 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.50 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.95 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.54 secs: 207 bytes ==> POST http://localhost:8081/orders HTTP/1.1 201 4.65 secs: 207 bytes ==> POST http://localhost:8081/orders

: :

Transactions: 1025 hits Availability: 63.55 % Elapsed time: 59.78 secs Data transferred: 0.34 MB Response time: 5.60 secs Transaction rate: 17.15 trans/sec Throughput: 0.01 MB/sec Concurrency: 96.02 Successful transactions: 1025 Failed transactions: 588 Longest transaction: 9.20 Shortest transaction: 0.00

- 63.55% 가 성공하였고, 운영시스템은 죽지 않고 지속적으로 CB 에 의하여 적절히 회로가 열림과 닫힘이 벌어지면서 자원을 보호하고 있음을 보여줌. 물론, 46% 의 실패율은 좋지 않기 때문에 동적 Scale out (replica의 자동적 추가,HPA) 을 통하여 시스템을 확장 해주는 후속처리가 필요.

### 무정지 재배포

### 



Description
MSA / DDD / Event Storming example on food delivery service
Readme 94 KiB
Languages
Java 93.1%
Python 3.8%
Dockerfile 3.1%