해결된 질문
작성
·
29
1
안녕하세요
일단 제가 생각은
컨트롤러에서 Mono 나 Flux 를 반환하고 webflux 가 이를 구독할 때 실행된다.
인데
어쨌든 구독하는 동작도 이벤트 루프 스레드가 하는 거라고 생각합니다.
그렇다면 구독에서부터 Mono 또는 Flux 실행까지 같은 이벤트 루프 스레드가 이어서 동작하는 건가요?
만약 제가 생각하는 게 맞다면 컨트롤러에서 수행하는 것과 구독후 수행하는 것의 순서만 다를 뿐 성능 차이를 모르겠는데 제가 어떤 부분을 잘못생각하고있는 걸까요?
개념이 잡히지 않아 질문이 좀 이상한 거 같아 죄송합니다.
답변 2
0
안녕하세요~ 좋은 질문 감사드립니다.
수강생분 잘 이해 하고 계신것이 맞습니다.
질문을 정리해보자면
어차피 Mono와 Flux코드를 하나의 이벤트 루프 스레드가 구독해서 전부 처리할것이라면
그냥 Mono나 Flux를 사용하지 않고 기존에 코드 짜던것처럼 동기적으로 코드를 짜도 똑같이 동작하는게 아닌가?
의 질문으로 이해했습니다.
블로킹이 없는 로직에서는 수강생분께서 말씀하신것처럼 Mono Flux코드를 전부 동기적인 코드로 바꿔도 성능 차이가 거의 없습니다.
강의 소개에서 말씀 드렸던 치킨의 예시가 있었는데요, 치킨을 주문과 동시에 바로 받을 수 있다면 tomcat과 netty에 어떤 성능 차이가 있을지 생각해보시면 이해가 편할것 같습니다.
반면에 IO 대기와 같은 블로킹을 유발할 수 있는 요소가 발생한다면 어떻게 될까요?
IO대기가 발생한다면 이벤트 루프 스레드는 반드시 이벤트 루프로 복귀 시켜야 하기 때문에, 비동기 api(webclient, r2dbc)를 사용하여 OS한테 대기를 맡기거나
스케쥴러를 사용하여 IO대기를 대신 수행합니다.
그리고 대기가 완료 되었을때 비동기 api의 경우 다시 이벤트 루프 스레드를 할당받아 후속 작업을 처리하게 됩니다.
이런 수 없이 발생하는 스레드의 변경을 유연하게 처리하는대에 Mono와 Flux만큼 쉽고 간편한 방법이 없습니다.
Mono와 Flux를 사용하면 스레드를 적재적소에 할당하여 성능을 보장하고 그에 대한 구현을 쉽게 할 수 있게 된다고 이해해주시면 될 것 같습니다.
10. 가장 중요 - WebFlux에서는 블로킹 처리를 어떻게 해야 할까?편과
강의를 모두 들으신 후에
24. GPT API와 다중 통신 - Chain of Thought 2 이편에서 스레드 흐름을 같이 복기해보시면 더 나은 이해를 가져가실 수 있을듯 합니다.
추가적으로 궁금한 부분 있으시다면 질문 부탁드립니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. minjun님.
Spring WebFlux에서의 Reactor 패러다임에서는 비동기 스트림을 다룹니다. Mono
와 Flux
는 이러한 비동기 스트림을 나타내며, 실제 데이터는 구독(subscribe)되어야 처리됩니다.
이벤트 루프와 스레드: WebFlux는 기본적으로 넷티(Netty) 기반의 이벤트 루프를 사용하며, 여기서 작업이 이루어집니다. 구독 동작도 이 이벤트 루프에서 이루어지며, 구독 후 실행되는 작업도 같은 이벤트 루프 스레드에서 수행됩니다. 다만, 상황에 따라 다른 스레드에서 작업이 전환될 수도 있습니다.
성능 차이와 순서: 컨트롤러에서 Mono
또는 Flux
를 반환한다는 것은 비동기 작업이 설정된 것이지, 곧바로 실행된다는 의미는 아닙니다. 실제로는 구독이 이루어져야 데이터 처리가 시작됩니다. 따라서, 구독 시점에 따라 작업이 지연될 수 있으며, 그래도 이벤트 루프의 스케줄링에 따라 실행이 될 것입니다.
비동기 환경에서는 이러한 동작 순서 및 스케줄링 메커니즘이 중요한데, subscribeOn()
과 publishOn()
연산자를 통해 좀 더 복잡한 스케줄링 제어를 할 수 있습니다. 각각의 연산자는 실행 스레드를 변경할 때 사용됩니다.
Spring WebFlux에서 Mono와 Flux의 동작 과정 이해하기
좀 더 구체적인 내용을 알고 싶으시다면 위 링크를 참조하시기 바랍니다. 전체적인 비동기 스트림의 흐름 및 스케줄링에 대한 이해를 더욱 넓힐 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.