Notice
Recent Posts
Recent Comments
Link
개발자는 기록이 답이다
패스트캠퍼스 환급챌린지 8일차 미션 (2월 8일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기 본문
패스트캠퍼스
패스트캠퍼스 환급챌린지 8일차 미션 (2월 8일) : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지 강의 후기
slow-walker 2024. 2. 8. 22:36
Reactive Streams를 알기 위해서는 Reactive manifesto에 대해 알아야 한다.
Reactive Streams를 만들기 위해 어떠한 조건과 구성요소를 갖춰야 한다고 선언하는게 Reactive manifesto이다.
1. Reactive란?
1. reacting to events or situations rather than acting first to change or prevent something
2. (무언가를 바꾸거나 예방하기 위해) 먼저 향동하기 보다는 사건이나 상황에 반응하는
2. Reactive manifesto
- 소프트웨어 아키텍처에 대한 선언문
- 구체적인 실천 방아나 이나 개발론을 갖고 있기 보다는
- Reactive Streams 의 특성을 강조하고 구축에 필요한 가이드 라인 제공하면서 같이 만들어 나가자
- 4가지의 핵심 가치 제시
- Responsvie
- Elastic : 유연성
- Message Driven : 메세지 기반
- Resilient : 문제가 생겼을때 복구될 수 있다
- 모든 작은 구성요소들이 reactive해야 전체 시스템이 reactive하다
3. Responsvie(응답성)
- 요구사항
- 문제를 신속하게 탐지하고 효과적으로 대처
- 신속하고 일관성있는 응답시간 제공
- 신뢰할 수 있는 상한성 설정해서 일관된 서비스 품질 제공
- 결과
- 가능한 한 즉각적으로 응답
- 사용자의 편의성과 유용성 기초
- 오류 처리를 단순화
- 일반 사용자에게 신뢰를 조성하고, 새로운 상호 작용 촉진
4. Resilient(복원력)
- 요구사항
- 복제,봉쇄,격리,위임에의해실현
- 장애는 각각의 구성요소에 포함(봉쇄)
- 구성 요소 : 시스템을 구성하는 각각의 컴포넌트
- MSA에서는 서버들, 하나의 서버 안에서는 객체
- 구성요소들은 서로 분리(격리)
- 복구 프로세스는 다른(외부의) 구성 요소에 위임 (위임)
- 필요한 경우 복제를 통해 고가용성이 보장 (복제)
- 결과
- 장애에 직면하더라도 응답성을 유지
- 시스템이 부분적으로 고장이 나더라도, 전체 시스템 을위험하게하지않고복구할수있도록보장
- 구성 요소의 클라이언트는 장애를 처리하는데에 압 박을 받지 않습니다
5. Elastic(유연성)
- 요구사항
- 경쟁하는 지점이나 중앙 집중적인 병목 현상이 존재 하지 않도록 설계
- 구성 요소를 샤딩하거나 복제하여 입력을 분산
- Resilient(복원력)에서의 복제 : 하나의 문제가 생겨도 다른걸로 대응하기 위함
- Elastic(유연성)에서의 복제 : 하나의 요청을 분산해서 처리
- 실시간 성능을 측정하는 도구를 제공
- 응답성있고예측가능한규모확장알고리즘을 지원
- 결과
- 작업량이 변화하더라도 응답성을 유지
- 입력 속도의 변화에 따라 이러한 입력에 할당된 자원을 증가시키거나 감소
- 상품 및 소프트웨어플랫폼에 비용효율이 높은 방식으로 유연성을 제공
6. Message Driven(메시지 기반)
- 요구사항
- 비동기 메시지 전달에 의존
- 명시적인 메시지 전달
- 위치 투명 메시징을 통신수단으로 사용 • 논블로킹 통신
- 결과
- 구성요소사이에서느슨한결합,격리,위치투명성 을보장하는경계를형성.이경계는장애를메시지 로 지정하는 수단을 제공
- 시스템에 메시지 큐를 생성하고, 모니터링하며 필요 시 배압을 적용
- 유연성을 부여하고, 부하 관리와 흐름제어를 가능하게
- 단일 호스트든 클러스터를 가로지르든 동일한 구성과 의미를 갖고 장애를 관리
- 수신자가활성화가되어있을때만자원을소비할 수있기때문에 시스템부하 를억제
- 정리
1. 비동기 통신: 구성 요소는 서로 비동기적으로 메시 지를 주고 받으며, 독립적인 실행을 보장한다.
2. 메시지 큐: 메시지 큐를 생성하고 배압을 적용하여 부하를 관리하고 흐름을 제어한다.
3. 복원력: 구성 요소 사이에 경계를 형성하여 직접적 인 장애의 전파를 막고 장애를 메시지로 지정해서 위치와 상관 없이 동일하게 장애를 관리한다.
4. 탄력성: 구성 요소 사이에 경계를 형성하여 각각의 구성 요소를 독립적으로 확장 가능하게 만들고, 자 원을 더 쉽게 추가하거나 제거한다.
- 핵심가치:가능한한즉각적으로응답
- 첫번째형태 : 장애에직면하더라도 응답성을 유지
- 두번째형태 : 작업량이변화하더라도응답성을 유지
- 방법 : 비동기non-blocking기반의메시지큐 를 사용해서 통신한다
6. 일반적인 서비스
![](https://blog.kakaocdn.net/dn/dlPIut/btsEFSI3OoF/lJqlVoPO1KVVwJan8YNCQk/img.png)
- 일반적인 서비스에서 구성요소 혹은 객체는 다른 객체를 직접 호출하고 데이터를 받는다
- → 동기적으로 응답을 받는다
- 이과정에서 경계가 무너지고 구성요소의 독립적인 실행이 보장되지 않으며 복원력, 유연성 모두 위협을 받게된다.
- 여기에 Reactive manifesto를 적용한다면?
- 구성 요소는 서로 비동기적으로메세지를 주고 받으며, 독립적인 실행을 보장한다
-
-> caller는 collect를 통해서 값을 조회해야 한 다. caller와 callee는 동기적으로 동작한다
-
- 메시지 큐를 생성하고 배압을 적용하여 부하를 관리하고 흐름을 제어한다
-
-> stream이 메시지 큐의 역할을 하지만, 부하를 관리할수없다
-
![](https://blog.kakaocdn.net/dn/rlY3V/btsEFTH0MLn/T8cyiCT9qN55IlRkk81401/img.png)
※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다. https://bit.ly/48sS29N