skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

MSA with Spring cloud #83

Open skarltjr opened 2 years ago

skarltjr commented 2 years ago

등장 배경

MSA

MicroService Architecture
- 단일 프로그램을 각 컴포넌트 별로 나누어 작은 서비스의 조합으로 구축하는 방법
- 각각의 서비스는 곧 스스로 돌아갈 수 있는 작은 서비스이며
- 독립적 배포 가능

MSA의 장점

개별적인 작은 서비스가 모여 하나의 큰 유연한 서비스를 이룬다.

1. 배포 관점
- 서비스 별 개별 배포 가능
- 각 서비스는 요구사항에 빠르게 대처할 수 있다

2. 확장 관점
- 특정 서비스에 대한 확장성이 용이
- 동시에 서비스마다 필요한 "무엇"을 선택적으로 가져갈 수 있다.

3. 장애 관점
- 개별 서비스의 장애가 전체 서비스의 장애로 이어질 가능성이 현저히 줄어든다.
- 부분적 장애에 대한 격리  

MSA의 단점

monolothic에 비해 복잡한 아키텍쳐로 서비스 규모의 증가는 곧 복잡도의 증가

1. 성능
- 서비스간 Api통신의 비용 및 latency가 증가할 수 있는 위험성

2. 테스트 및 트랜잭션
- 서비스가 분리되어 있어 테스트의 복잡도가 증가하며
- 트랜잭션의 관리가 어렵다

3. 데이터 관리
- 데이터가 여러 서비스에 걸쳐 분산되어있기 때문에 조회 및 정합성관리의 어려움이 존재한다. 
skarltjr commented 2 years ago

spring cloud

앞서 말했듯이 서비스의 규모가 커지면 복잡도 또한 증가한다고한다.
spring cloud는 이러한 부분을 지원해주는데

- 분산 시스템에서 공통적인 패턴(구성 관리, 서비스 검색, 라우팅 등..)을 구축할 수 있는 라이브러리 제공
- 이를 통해 개발자는 분산 시스템에서 공통적으로 필요한 설정을 보다 쉽게 구축가능하며
- 따라서 서비스의 기능 구현에 집중할 수 있다.

spring cloud의 기능 목록

spring cloud를 활용한 이상적인 마이크로 서비스 환경 구성

  1. Message queue :
    • 이상적인 마이크로서비스 환경은 마이크로서비스 사이의 통신이 비동기적으로 이루어지는 것인데,
    • MQ를 사용하면 마이크로 서비스들이 외부의 Queue를 통해 메세지를 주고받도록 함으로써 쉽게 이 부분을 구성할 수 있다.

여기서 잠깐! 처음에는 단순히 비동기로 처리할 수 있는 부분을 비동기로 처리함으로써 빠른 응답시간을 가져올 수 있어서 까지만! 생각해볼 수 있었는데 scale-out에 따른 데이터베이스 정합도 문제와도 관련된 얘기를 찾아볼 수 있었다.

★msa는 각 서비스별로 scale-out이 가능하다. 예를 들어 주문 서비스가 존재한다고 생각해보자 이 때 아래 그림에서 a,b,c라는 데이터가 들어오면 어디에 저장될까? -> 분산되어 저장되는 경우 이벤트를 통해 동기화 -> 추가로 데이터베이스 다중화의 경우 master db가 command를 처리하고 이벤트로 다른 slave db와 동기화 시킨 후 조회를 slave에서 처리하기도 한닥 그러면 여기서 정합성 문제가 생기는데 이 때 아래 그림과 같은 방식으로 mq를 사용하면 정합성문제를 해결할 수 있다고한다.


- <img width="378" alt="스크린샷 2022-03-16 오후 5 36 27" src="https://user-images.githubusercontent.com/62214428/158549484-764b80a0-c847-4096-9f0a-9eeefaccbbcb.png">
skarltjr commented 2 years ago

Eureka

eureka server & client

eureka server
- 유레카 서버는 유레카 클라이언트에 해당하는 마이크로서비스들의 상태 정보가 등록되어있는 레지스트리를 갖는다
- client는 서비스가 시작될 때 자신의 정보를 등록
- heartbeat를 통해 클라이언트는 30초마다 레지스트리에 ping을 전송하여 자신이 가용 상태임을 알린다
- 레지스트리의 정보는 모든 유레카 클라이언트에 복제되어 있어 필요할 때마다 가용 상태인 모든 서비스 목록 확인이 가능
skarltjr commented 2 years ago

https://github.com/skarltjr/msa-practice