[System Design] Request Collapsing

Request Collapsing

Request collasping은 빈번한 요청을 그룹화하고, 비슷한 요청을 하나로 합쳐서 효율적으로 처리하고 네트워크 대역폭과 서버 부하를 줄이는 테크닉이다.

Thundering heard 문제와 같이 순간적으로 요청이 폭증하는 경우, 중복되는 요청을 하나로 묶어 원본 서버에는 하나의 요청만 전달하도록 할 수 있다. 아래 다이어그램을 통해 문제의 상황을 살펴보자.

동일한 요청이 순간적으로 버스트되는 경우 서버는 스토리지에 동일한 요청을 중복으로 보내게 된다. 이 상황은 때때로 불필요한 네트워크 대역폭이나 리소스 사용을 유발할 수 있으며, 온라인 티켓팅 서비스나 플래시 세일과 같은 시나리오에서 쉽게 접할 수 있다.

이 문제를 회피할 수 있는 효과적인 방법 중 하나는 request collasping을 구현하는 것이다.

  • 모든 요청은 promise를 반환하는 함수(L1_MISS_FUNCTION)을 반환한다. 일반적으로 이 함수는 L2 또는 DB를 읽는다.
  • Key(ID)를 기반으로 요청하면 첫 번째 reader만 L1_MISS_FUNCTION을 실행할 수 있다.
  • 나머지 reader들은 promise가 완료되지 않은 상태에서 요청이 들어오면 즉시 첫 번째 호출에서 반환된 promise를 L1_MISS_FUNCTION으로 반환받는다.
  • 모든 reader는 값을 읽기 위해 반환된 promise를 기다린다.
  • promise가 완료되면 L1에서 promise를 제거한다.

이 방법에는 아주 짧은 순간에 캐시된 데이터가 변경되면 오래된 데이터를 보게될 순 있지만, 많은 트래픽을 감당하는 서비스의 설계에 강력한 일관성을 달성하는 과제는 쉽지 않은 과제이기에 약간의 불일치를 허용하고 서비스를 운영하게 된다면 수용할 수 있는 트래픽은 비약적으로 늘어나게 된다. 아래는 해당 시나리오로 스트레스 테스트를 진행한 결과다.

  • key size : 100KB
  • vuser : 1000

Request Collasping

PER Algorithm

스트레스 테스트를 진행한 결과 0.5 분위에서는 약 4배 0.99분위에서는 2배정도 까지 빠른 응답을 보장했다. 또한 네트워크 대역폭, serialize 비용 등 여러 불필요한 리소스 사용을 줄이게 되어 기존 대비 약 8배 더 높은 TPS를 처리할 수 있게 되었다.

Author: Song Hayoung
Link: https://songhayoung.github.io/2023/09/09/System%20Design/etc/request-collapsing/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.