JVM/Spring

[Toby Spring Reactive Programming] 자바, 스프링의 비동기 (4)

Hyo Kim 2023. 10. 17. 22:02
728x90
반응형

서론

https://www.youtube.com/watch?v=aSTuQiPB4Ns

토비님의 유튜브 강의 내용을 정리한 글 입니다.


본론

 

스프링 컨트롤러 리턴타입에 따른 동작방식

 

#1 Object

@GetMapping("/async")
public String async() throws InterruptedException {
    log.info("async");
    Thread.sleep(2000);
    return "hello";
}

기본 tomcat thread pool 수인 200개 까지만 동시처리가 가능하다. [링크]

https://tomcat.apache.org/tomcat-8.5-doc/config/executor.html

 

#2 Callable

@GetMapping("/callable")
public Callable<String> callable() throws InterruptedException {
    log.info("callable");
    return () -> {
        log.info("async");
        Thread.sleep(2000);
        return "hello";
    };
}

http-nio threed는 1~2개로 백그라운드 스레드를 통해 비동기 리턴을 하기 때문에 1000개 동시처리 시 2초에 가깝게 끝이 난다.

 

#3 DeferredResult

Queue<DeferredResult<String>> results = new ConcurrentLinkedDeque<>();

@GetMapping("/dr")
public DeferredResult<String> deferred() throws InterruptedException {
    log.info("dr");
    DeferredResult<String> dr = new DeferredResult<String>();
    results.add(dr);
    return dr;
}

@GetMapping("/dr/count")
public String drCount() {
    return String.valueOf(results.size());
}

@GetMapping("/dr/event")
public String drEvent(String msg) {
    for (DeferredResult<String> dr : results) {
        dr.setResult("Hello " + msg);
        results.remove(dr);
    }
    return "Ok";
}

/dr API호출 시 바로 응답이 나가는 게 아닌, /dr/event API를 통해 비동기적으로 응답을 보내줄 수 있다.

 

#4 ResponseBodyEmitter

@GetMapping("emitter")
public ResponseBodyEmitter emitter() {
    ResponseBodyEmitter emitter = new ResponseBodyEmitter();

    Executors.newSingleThreadExecutor().submit(() -> {

        try {
            for (int i = 1; i <= 50; i++) {
                emitter.send("<p>Stream " + i + "</p>");
                Thread.sleep(2000);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    });
    return emitter;
}

ResponseBodyEmitter를 먼저 리턴하고, 비동기적으로 send()를 통해 데이터를 넘길 수 있다.

 

 

 

728x90
반응형