상세 컨텐츠

본문 제목

Throttling과 debounce에 대해 알아보자

Spring

by 조킴 2022. 12. 11. 18:37

본문

반응형

 

서론 

최근 링크드인을 시작하며 여러 가지 정보들을 많이 받고 있다. 

 

링크드인을 통해 영상을 보던 도중 현재 내가 진행하였던 푸시 알림 서비스 관련하여 debounce를 적용하여 구현하셨다는 인터뷰 영상을 접하였고, 해당 개념을 한번 살펴보며 예제를 작성해보고 어떤 식으로 사용할 수 있을지 찾아보며 공부를 진행해보았다. 

 

공부를 진행하며 해당 개념에 대해 다시 한번 정리해보고자 포스팅을 작성하게 되었다. 

 

해당 포스팅에서는 다음과같은 항목들을 다뤄보려고 한다. 

 

  • 스로틀링이란? 
  • 디 바운스란? 
  • 두 개념의 공통점과 차이점 
  • 예제 코드
  • 결론 
  • 참고 ref 

 

쓰로틀링 ( throttling )

  • API가 서버에서 사용되는 속도를 제한하는 프로세스로서, 단위 ( 초 , 분... )에 실행할 수 있는 서비스 요청 수를 제한한다. 
  • 일정한 실행의 흐름을 만들기 위해 마지막 함수가 호출된 후 설정한 시간 동안 다시 호출되는 것을 방지한다.

 

ref 참고 : medium.com Heshan Sudarshana

 

해당 그림을보면 알 수 있듯이 쓰로틀링을 사용하여 서버의 부하를 제한하고 원활한 성능을 유지할 수 있다는 장점을 가지고 있다. 

 

 

디 바운스 ( Debounce ) 

  • 연이어 호출되는 함수들 중 마지막 함수(또는 제일 처음)만 호출하도록 한다

 

디바운스 예상 플로우 ( 출처 : 나 )

위 플로우와 같이 만약 이벤트가 끝났는지 확인 이후, 만약 끝나지 않았다면 지속적으로 이벤트를 진행시키고 

 

만약, 끝났다면 이중 마지막 혹은 처음만 호출하도록 return을 할 수 있다. 

 

 

아 그렇구나! 개념에 대해 다음과 같이 간단하게 살펴봤다. 그럼 두 가지는 어떠한 공통점을 가지고 있을까? 

 

공통점과 차이점 

공통점 

만약, 동시간 대 접속자가 몰리면 수많은 이벤트가 발생하게 되고 이때 어떤 함수에는 병목현상이 발생하게 된다. 

 

이 두 가지의 개념은 해당 현상을 방지할 수 있다는 공통점을 가지고 있다. 

정리하면, "특정 함수 그룹을 호출할 때 시간 간격을 두어 실행되도록 하여 위 문제를 개선하도록 돕는 기능"으로 정리할 수 있을 것 같다. 

 

음.. 해당 개념들을 현재 내 상황에 덧붙여보면 다음과 같은 상황으로 바꿀 수 있을 것 같다. 

동일하고 반복되는 요청들 중, 전부가 아닌 최신의 데이터만 필요한 경우!? 이 두 가지의 개념을 사용해볼 수 있지 않을까!? 

 

비유가 적절할지 모르겠다. 

 

차이점을 알아보면 다음과 같다. 

 

차이점 

디 바운스(Debounce)는 아무리 많은 이벤트가 발생하더라도 모두 무시하고 특정 시간 사이에 어떤 이벤트도 발생하지 않았을 때 딱 한 번만 마지막 이벤트를 발생시키는 기법이다. 

 

하지만, 쓰로틀링(Throttling)은 정기적으로 기능 실행을 보장한다.

 

마치며  

디 바운스의 경우, 나는 다음과 같은 사례에 타협하며 적용해볼 수 있지 않을까?라는 생각이 들었다. 

  • 좋아요의 총개수의 따른 푸시 알림 

위와 같은 사례를 생각한 건 다음과 같다. 

사람마다 차이는 있지만,  유명 셀럽의 경우 포스팅을 업로드 할시, 매 초마다 어마 무시한 좋아요가 눌려진다. 

항상 그때마다 Like에 대한 푸시를 중간 서버에 요청하게 되어 진다. 

 

정말 중요한 정보는 총 몇 개의 좋아요가 해당 게시물에 찍혔는지일 것이다. 

이 부분을 착안하여 수많은 요청 중 디 바운스를 이용해 마지막 최종적으로 몇 개의 좋아요가 찍혔는지 최신 데이터를 유저에게 알림을 전송하는 식으로의 플로우라면 적용해 볼 수 있지 않을까? 란 생각이 들었다. 

 

물론, 실시간성이 보장되어야 하고 중요한 데이터의 경우 전부 소중하기에 이는 제외다!

예제 코드 

https://github.com/JoeCP17/spring-study/tree/master/thread

 

Ref.

https://stackoverflow.com/questions/4742210/implementing-debounce-in-java

https://medium.com/teamarimac/implementing-throttling-in-java-spring-boot-ec4723cfce9f

https://webclub.tistory.com/607

 

반응형

관련글 더보기