BackEnd/spring

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

하용권 2025. 5. 22. 00:15

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에서 성능 개선을 기대할 수 없다는 것 입니다.

 

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

 

반응형