Waiting Queue와 Processing Queue의 관리 주체는 각각 무엇인가?
answer
서버 애플리케이션 시스템의 과부화 방지를 위해 Waiting Queue는 Redis와 같은 별도의 저장소에서 관리됨
Processing Queue는 Worker Thread Pool, Scheduler, 서비스 계층 등을 통해 관리됨
Controller를 실행하는 스레드 측에서 결과를 비동기로 받아오는 동안에는 스레드 실행이 멈추는 건가?
answer
Spring Webflux, CompletableFuture, callback 기반 non-blocking I/O를 사용하면 요청 처리를 대기하는 동안 스레드가 멈추지 않음
I/O 혹은 외부 시스템 호출과 같이 대기 시간이 발생하는 작업은 별도의 스레드 또는 이벤트 루프에서 처리됨
스레드 풀, 큐의 크기를 적당히 조절하고 모니터링을 통해 병목 구간을 추적할 수 있도록 할 것
비동기 방식 도입 시 요청 처리 결과를 기다리는 스레드, 요청을 대기 큐 및 작업 큐로 옮기는 스레드, 별도의 스케줄러 등을 통해 비즈니스 로직을 처리하는 스레드 각각이 수행되는 건가?
answer
요청한 스레드는 non-blocking 사용 시 sleep하지 않음
대기 큐 저장: Controller 혹은 초기 요청 처리 로직에서 수행
작업 큐 저장: 스케줄러 or Worker Thread에서 담당
비즈니스 처리: 스케줄러 or Worker Thread에서 담당
대기 큐 하나만 관리하는 것에 비해 장단이 무엇인가?
answer
예약 추가 & 취소 시에만 적용되도록 해야 하나?
요청별로 큐를 분리하자.
분리하는 이유
요청 객체와 비동기 객체 간 분리
비동기 객체를 사용해야 하는 비동기 방식의 경우 둘을 분리해서 관리하는 게 용이하다고 생각된다.
둘을 Redis 큐에 같이 저장할 경우 비동기 객체의 (역)직렬화가 어렵고 분산 시스템에 적절하지 않다.
또한 둘을 분리하면 요청 처리 및 결과 전달이 느슨하게 결합되어 독립적으로 최적화 할 수 있을 뿐 아니라 분산 시스템에서 확장이 용이해진다.
반면 비동기 객체를 사용하지 않고도 요청 처리 결과를 전달 가능한 기술을 사용한다면 이러한 고민은 깔끔하게 해결된다.
다만 해당 기술이 요구하는 러닝 커브를 극복해야 한다는 문제는 존재한다.