마이크로서비스에서는 요청을 통해 애플리케이션과 협동한다. 따라서, IPC(프로세스간 통신)는 매우 중요하고 가용성에 많은 영향을 미친다.
RPI는 클라이언트가 서비스에 요청을 보내면 서비스가 처리 후 응답을 회신하는 IPC
REST 성숙도
간단하고 편리. 시스템 단순. 테스트 쉬움
REST API는 요청 한번으로 많은 리소스를 가져오기 힘듬 -> GraphQL, 팔코의 각광
http 동사가 제한적 -> gRPC의 각광
gRPC API는 하나 이상의 서비스와 요청/응답 메시지 데피니션(definition, 정의한 코드)으로 구성
큰 메시지에 유리, 양방향 스트리밍으로 RPI, 메시징 둘다 가능
연속 실패 횟수가 주어진 임계치를 초과하면 일정 시간 동안 호출을 즉시 거부하는 RPI 프록시. -> 프록시 객체를 통해 몇번의 요청이 실패하면 더 이상 호출하지 않음
구현법
ex) 넷플릭스 히스트릭트
하지만, 부분적인 솔루션일뿐 불능 서비스를 복구시키지는 못한다.
애플리케이션 수준의 서비스 디스커버리 : 서비스 레지스트리에 서버 등록
도커/쿠버네티스에서 제공
서드파티 등록 패턴 : 등록기가 서비스 레지스트리 업데이트
서버쪽 디스커버리 패턴: DNS가 서비스 레지스트리에 접근, DNS를 통한 처리
비동기는 위 4가지 방식 한개로 구현
메시징 기반의 애플리케이션은 메시지 브로커 사용
브로커리스 메시징도 있음 (성능 향상, 운영복잡도 저하, but 가용성 떨어짐, 전달보장 매커니즘 어려움)
장점 : 느슨한 결합, 메시지 버퍼링, 유연한 통신, 명시적 IPC
단점 : 성능 병목 가능성, 단일 장애점 가능성 (브로커가 저가용성인 경우), 운영복잡도 증가
메시지 순서를 유지하면서 수평 확장이 가능할까?
샤딩 방식의 채널을 통해 가능 (ex. AWS Kinesis, Kafka)
DB 테이블을 메시지 큐로 활용
이벤트 발행 : 폴링 발행기 패턴 -> SELECT 후 삭제
이벤트 발행 : 트랜잭션로그 테일링 패턴 -> 트랜잭션 로그 읽기
트랜잭션 로그 테일링 : 디비지움, DynamoDB 스트림즈
동기 방식
1. 클라이언트가 주문 서비스에 HTTP POST /orders 요청을 합니다.
2. 주문 서비스는 소비자 서비스에 HTTP GET /consumers/id를 요청하여 소비자 정보를 조회합니다.
3. 주문 서비스는 음식점 서비스에 HTTP GET /restaurant/id를 요청하여 음식점 정보를 조회합니다.
4. 주문 서비스는 이렇게 조회한 소비자/음식점 정보로 올바른 주문인지 확인합니다.
5. 주문 서비스는 주문을 생성합니다.
6. 주문 서비스는 클라이언트에 HTTP 응답합니다....
비동기 방식
1. 주문 서비스는 주문을 PENDING 상태로 생성합니다.
2. 주문 서비스는 주문 ID가 포함된 응답을 클라이언트에 반환합니다.
3. 주문 서비스는 ValidateConsumerInfo 메시지를 소비자 서비스에 전송합니다.
4. 주문 서비스는 ValidateOrderDetails 메시지를 음식점 서비스에 전송합니다.
5. 소비자 서비스는 ValidateConsumerInfo 메시지를 받고 주문 가능한 소비자인지 확인 후, ConsumerValidated 메시지를 주문 서비스에 보냅니다.
6. 음식점 서비스는 ValidateOrderDetails 메시지를 받고 올바른 메뉴 항목인지 음식점에서 주문 배달지로 배달이 가능한지 확인 후, OrderDetailsValidated 메시지를 주문 서비스에 전송합니다.
7. 주문 서비스는 ConsumerValidated 및 OrderDetailsValidated를 받고 주문 상태를 VALIDATED로 변경합니다.
8. …...
위와 같이 비동기 방식을 통해, 서비스간 느슨함을 유지시켜, 가용상 향상, 장애 전파를 막음
"마이크로서비스 패턴" 중에서
크리스 리처드슨