본문 바로가기
BackEnd/spring

[Spring] webflux에서 별도의 스케줄러를 이용하여 cpu bound 작업 처리 vs 그냥 처리

by 하용권 2025. 5. 22.

webflux로 구현되어 있다면, blocking call이 있을 경우 성능이 크게 저하됩니다.

 

blocking이 있는지 검출하기 위해 blockhound를 사용하여 감지할 수 있습니다.

 

만약 blokcing call이 있다면,

 

와 같은 에러 메시지가 발생합니다.

 

이는 snappy로 압축하는 부분에서 발생한 에러입니다.

테스트 용이라 매우 간단하게 구현했습니다.

 

 

이 blocking call을 피하기 위해서는 별도의 스케줄러를 이용해서 처리하라고 합니다.

(출처 : https://www.baeldung.com/java-handle-blocking-method-in-non-blocking-context-warning)

 

그래서 이렇게 수정을 하면, block hound에서는 더 이상 에러가 발생하지 않습니다.

 

 

그러면 이 경우에는 성능이 개선이 되었을까요?

이는 실제 회사에서 마주친 이슈였습니다. 

(물론 다른 로직들이 많이 있습니다.)

 

사실 제 생각에는 크게 성능이 증가하지 않을 것이라고 생각했었습니다.

webflu의 경우에는 io 작업이 있다면, 이를 queue에 넣습니다.

그리고 완료되면 다시 그 후 작업을 진행하게 됩니다.

 

하지만 이 압축은 cpu를 사용하는 작업입니다. cpu bound 작업은 task를 cpu가 처리하고 있는 동안 다른 작업을 병렬로 처리할 수 없다고 생각했었습니다.

 

 

회사에서 부하 테스트를 해봤을 때는 예상대로 큰 차이가 없었습니다.

실제 로컬에서 부하테스트를 했을 때도 큰 차이가 없었던 것을 확인할 수 있습니다.

 

 

결론은 cpu를 사용하는 작업은 webflux에서 성능 개선을 기대할 수 없다는 것 입니다.

 

(틀린 내용이 있다면 피드백 주시면 감사하겠습니다!)

 

반응형