아래 글을 읽고 오면 도움이 됩니다.
https://codenme.tistory.com/100
restTemplate: 멀티 스레드 Blocking 방식( 호출하는 함수가 호출된 함수의 응답을 대기한다. )
- HTTP 요청 후 Json, xml, String과 같은 응답을 받을 수 있는 템플릿
- RESTful 형식을 지원한다
- 멀티 스레드와 Blocking 방식 사용
- Blocking I/O 기반의 동기 방식 API
- Thread Pool은 어플리케이션 구동 시 설정된 만큼 Thread 를 미리 만들어 놓는다.
- Request는 Queue 에 쌓이고 가용한 스레드가 있으면 그 스레드에 할당되어 처리 (1개의 request당 1개의 thread가 처리)
- 각 스레드에서는 Blocking 방식으로 처리되어 응답이 올 때까지 그 스레드는 다른 요청에 할당될 수 없다.
RestTemplate의 단점
- 요청을 처리할 스레드가, 스레드 풀에 충분히 남아있다면 위와같은 방법이 아무런 문제가 없지만
스레드가 다 차는 경우 이후의 요청은 Queue에 대기한다.
DB 와의 통신에서 문제가 생기기 때문에 락이나 병목현상이 일어나면 가용 가능한 스레드 수가 현저하게 줄어들기 때문에, 전체 서비스가 매우 느려진다.
- 웹 클라이언트가 응답을 받을 때 까지 스레드가 차단되는데, 각각의 스레드가 일정량의 메모리와 CPU를 사용합니다.
이때, 결과를 기다리는 느린 서비스를 기다리는 수신 요청이 많다고 한다면 요청이 쌓이고 많은 스레드를 생성해서 스레드 풀을 소모하거나 많은 메모리를 차지하게 된다. 또한 빈번한 Context Switch을 통해 성능 저하가 발생할 수 있다.
WebClient: 싱글 스레드 Non-Blocking 방식(호춣하는 함수가 호출된함수의 응답을 대기하지 않는다. )
- 웹으로 API를 호출하기 위해 사용되는 Http Client 모듈 중 하나
- 기존의 Sync API와 더불어, Non-Blocking & async 접근 방식을 통해 효율적인 통신을 돕는다.
- 싱글 스레드(코어당 1개의 스레드)와 Non-Blocking 방식 사용
- 이벤트에 반응형으로 동작(Spring React 프레임워크 사용)
- Reactor 기반의 Functional API이다
- RestTemplate과 같이 HTTP 요청 후 응답받을 수 있는 템플릿 역할
Non-Blocking을 통해 병목현상을 완화하고, Async 방식을 통해 요청에 대한 응답을 기다리지 않고 작업을 계속해서 수행하기에 성능적 이점이 있습니다.
- 각 Request는 Event Loop 내에 Job으로 등록
- Event Loop는 각 job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 job을 처리
- Event Loop는 제공자로부터 Callback으로 응답이 오면, 그 결과를 요청자에게 제공
webClient 사용법
아래는 구글 로그인 api 사용(get) 예시이다.
public ClubMemberDTO get_ClubMemberDtoByGoogle_Token(String google_token) {
WebClient webClient = WebClient.create();
String url = String.format("https://oauth2.googleapis.com/tokeninfo?id_token=%s", google_token);
return webClient.get()
.uri(url)
.retrieve()
.bodyToMono(ClubMemberDTO.class)
.block();
}
public xxxx(String google_token) {
WebClient webClient = WebClient.create();
String url = String.format("https://oauth2.googleapis.com/tokeninfo?id_token=%s", google_token);
return webClient.post()// .get() .post() .patch() .delete().....
.uri(url)
.retrieve()
.bodyToMono(ClubMemberDTO.class)
.block();
}
- WebClient는 이렇게 이벤트에 대한 반응형으로 설계가 되었기 때문에 비동기성, 가용성, 반응성, 탄련성을 보장하는 Spring React
- 반응성, 탄련성, 가용성, 비동기성을 보장하는 Spring React 프레임워크에서 사용한다.
'back-end study' 카테고리의 다른 글
[Optimization] 캐싱(caching)을 통한 성능 개선 분석 (0) | 2023.08.03 |
---|---|
성능 지표에 관하여 (ThroughPut, Latency) (0) | 2023.06.21 |
HTTP 클라이언트- Apache HttpClient VS OkHttpClient VS Spring WebClient (0) | 2023.06.15 |
Blocking / Non-blocking 과 Sync / Async 의 차이 (0) | 2023.06.08 |
[Optimization] 인덱싱(indexing)을 통한 성능 개선 분석 (0) | 2023.04.25 |