본문 바로가기
Spring Boot(JAVA)

1. Reactive - 함수형 인터페이스 / 블로킹 & 논블로킹

by #Glacier 2024. 4. 4.
반응형

함수형 인터페이스는 1개의 추상 메소드를 가지고 있는 인터페이스이다.

 

(Function, Consumer, Supplier, Runnable)

함수형 인터페이스는 1급 객체로 사용할 수 있어

1) 함수형 인터페이스에 변수를 할당

2) 함수형 인터페이스로 인자를 전달

3) 함수형 인터페이스를 반환값으로 사용

4) 함수형 인터페이스를 구현한 익명 클래스를 람다식으로 변경할 수 있다.

 

이 함수형 인터페이스는 호출한 Thread에서 실행된다.

 

이는 Bloking과 Nonbloking과 관련이 있다.

 

함수 호출의 관점에서 A -> B를 call 할 때, A -> B에서 B의 응답과정이 동기와 비동기로 나뉘는 요점이 된다.

 

즉 A -> B call 시에 A는 B가 어떤 결과를 반환하기까지 기다려야 하는 상황이면 블로킹 상태라고 하며

이 동안에는 Caller인 A는 아무것도 할 수 없는 상태이다.

블로킹 상태에서 동기처리가 되는 경우 Caller가 값을 받아 직접 처리하는 경우이며,

논블로킹 상태의 비동기처리는 결과 자체는 Callee가 처리하는 경우이다.

 

반면, A -> B call 시 B가 어떤 결과를 반환하기까지 기다리지 않고 다른 일을 할 수 있는 상황은 논블로킹 상태라고 하며,

논블로킹 상태의 동기처리가 되는 경우 Caller인 A는 계속 다른 일을 할 수 있으며

결과값을 받아 직접 처리하는 경우이고,

논블로킹 상태의 비동기 처리는 Caller인 A가 계속 다른일을 하다가 결과를 받아 직접 처리 하는 경우이다.

 

I/O 관점 Blocking/Non-bloking을 보면

 

CPU bound blocking 

thread가 대부분의 시간동안 CPU를 점유하는 경우이다.

연산이 많은 경우로, 코어와 같은 하드웨어적인 부분을 증설해주는 수밖에 없다.

 

I/O bound blocking

thread가 대부분을 wait하고 있다가 읽기/쓰기, 네트워크 요청처리, 요청 전달 등으로 블로킹 되는 경우

I/O bound blocking이라고 한다.

 

근데 이런 I/O bound blocking의 경우, 여러 가지 일들이 중첩적으로 일어나는 경우 더 문제가 될 수 있다.

예를 들면 블로킹이 여러개 있다가 중간에 논블로킹 task가 있는데 중간의 블로킹에서 시간이 소요되는 경우

논블로킹 task가 끝나더라도 응답을 받을 수 없는 상태에 있어 결국 처리되지 못한다.

 

즉, 관계된 모든 함수들이 non-blocking이어야 non-blocking이 진정한 의미를 갖게 될 수 있다.

 

즉 Spring Reactive Web 측면에서 봤을 때에는 I/O bound blocking을 극복할 수 있는 무기가 된다.

반응형

'Spring Boot(JAVA)' 카테고리의 다른 글

6. Reactive - Reactor Schedulers  (0) 2024.04.05
5. Reactive - Reactor와 연산자  (0) 2024.04.04
4. Reactive - Spring MVC VS Webflux  (0) 2024.04.04
3. Reactive - Netty  (0) 2024.04.04
2. Reactive - CompletableFuture  (0) 2024.04.04