Update README.md

This commit is contained in:
Jinyoung Jang
2020-04-19 15:12:15 +09:00
committed by GitHub
parent 1d84bb092d
commit 16903df8a7

125
README.md
View File

@@ -176,14 +176,102 @@ http localhost:8081/orders/1
```
### 폴리글랏 퍼시스턴스 / 플랫폼
### 폴리글랏 퍼시스턴스
고객관리 서비스의 시나리오인 주문상태, 배달상태 변경에 따라 고객에게 카톡메시지기능의 구현 파트는 해당 팀이 python 을 이용하여 구현하기로 하였다. 해당 파이썬 구현체는 각 이벤트를 수신하여 처리하는 Kafka consumer 로 구현되었고 코드는 다음과 같다:
앱프런트 (app) 는 서비스 특성상 많은 사용자의 유입과 상품 정보의 다양한 콘텐츠를 저장해야 하는 특징으로 인해 RDBDocument DB / NoSQL 계열의 데이터베이스인 Mongo DB 를 사용하기로 하였다. 이를 위해 order 의 선언에는 @Entity 가 아닌 @Document 로 마킹되었으며, 별다른 작업없이 기존의 Entity Pattern 과 Repository Pattern 적용과 데이터베이스 제품의 설정 (application.yml) 만으로 MongoDB 에 부착시켰다
```
# Order.java
# OrderRepository.java
# application.yml
```
MongoDB 를 이후 운영단계에서도 사용할 수 있게 하기 위해서 deployment.yaml 을 아래와 같이 설정하였다:
```
```
### 폴리글랏 프로그래밍
고객관리 서비스(customer)의 시나리오인 주문상태, 배달상태 변경에 따라 고객에게 카톡메시지 보내는 기능의 구현 파트는 해당 팀이 python 을 이용하여 구현하기로 하였다. 해당 파이썬 구현체는 각 이벤트를 수신하여 처리하는 Kafka consumer 로 구현되었고 코드는 다음과 같다:
```
from flask import Flask
from redis import Redis, RedisError
from kafka import KafkaConsumer
import os
import socket
# To consume latest messages and auto-commit offsets
consumer = KafkaConsumer('fooddelivery',
group_id='',
bootstrap_servers=['localhost:9092'])
for message in consumer:
print ("%s:%d:%d: key=%s value=%s" % (message.topic, message.partition,
message.offset, message.key,
message.value))
# 카톡호출 API
```
파이선 애플리케이션을 컴파일하고 실행하기 위한 도커파일은 아래와 같다 (운영단계에서 할일인가? 아니다 여기 까지가 개발자가 할일이다. Immutable Image):
```
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host pypi.python.org -r requirements.txt
ENV NAME World
EXPOSE 8090
CMD ["python", "policy-handler.py"]
```
### 동기식 호출 과 Fallback 처리
분석단계에서의 조건 중 하나로 주문(app)->결제(pay) 간의 호출은 동기식 일관성을 유지하는 트랜잭션으로 처리하기로 하였다. 호출 프로토콜은 이미 앞서 Rest Repository 에 의해 노출되어있는 REST 서비스를 FeignClient 를 이용하여 호출하도록 한다.
- 결제서비스를 호출하기 위하여 Stub과 (FeignClient) 를 이용하여 Service 대행 인터페이스 (Proxy) 를 구현
```
# (app) 결제이력Service.java
package fooddelivery.external;
@FeignClient(name="pay", url="http://localhost:8082")//, fallback = 결제이력ServiceFallback.class)
public interface 결제이력Service {
@RequestMapping(method= RequestMethod.POST, path="/결제이력s")
public void 결제(@RequestBody 결제이력 pay);
}
```
- 주문을 받은 직후(@PostPersist) 결제를 요청하도록 처리
```
# Order.java (Entity)
@PostPersist
public void onPostPersist(){
fooddelivery.external.결제이력 pay = new fooddelivery.external.결제이력();
pay.setOrderId(getOrderId());
Application.applicationContext.getBean(fooddelivery.external.결제이력Service.class)
.결제(pay);
}
```
- 서킷브레이커, 폴백의 은 운영단계에서 설명한다.
### 비동기식 호출 / 시간적 디커플링 / 장애격리 / 최종 (Eventual) 일관성 테스트
```
#상점 서비스를 잠시 내려놓음
kill (lsof -i )
@@ -234,38 +322,7 @@ http localhost:8080/주문s 품목=피자 수량=2 주소=서울 #성공
* 서킷 브레이킹 프레임워크의 선택: Spring FeignClient + Hystrix 옵션을 사용하여 구현함
시나리오는 단말앱(app)-->결제(pay) 시의 연결을 RESTful Request/Response 로 연동하여 요청이 도할 경우 CB 를 통하여 장애격리하는 시나리오.
- 결제서비스를 호출하기 위하여 Stub과 (FeignClient) 를 이용하여 Service 대행 인터페이스 (Proxy) 를 구현
```
# (app) 결제이력Service.java
package fooddelivery.external;
@FeignClient(name="pay", url="http://localhost:8082")//, fallback = 결제이력ServiceFallback.class)
public interface 결제이력Service {
@RequestMapping(method= RequestMethod.POST, path="/결제이력s")
public void 결제(@RequestBody 결제이력 pay);
}
```
- 주문을 받은 직후(@PostPersist) 결제를 요청하도록 처리
```
# Order.java (Entity)
@PostPersist
public void onPostPersist(){
fooddelivery.external.결제이력 pay = new fooddelivery.external.결제이력();
pay.setOrderId(getOrderId());
Application.applicationContext.getBean(fooddelivery.external.결제이력Service.class)
.결제(pay);
}
```
시나리오는 단말앱(app)-->결제(pay) 시의 연결을 RESTful Request/Response 로 연동하여 구현이 되어있고, 결제 요청이 도할 경우 CB 를 통하여 장애격리.
- Hystrix 를 설정: 요청처리 쓰레드에서 처리시간이 610 밀리가 넘어서기 시작하여 어느정도 유지되면 CB 회로가 닫히도록 (요청을 빠르게 실패처리, 차단) 설정
```