[아키텍처] 대용량 트래픽을 견디기 위한 대표 방법들 5가지

출처: 인스타그램 @watergalsstoon

 

 

 

 

대용량 트래픽을 처리하는 방법


대용량 트래픽 상황에서 시스템의 성능과 안정성을 유지하기 위해서는 다양한 방법이 있다. 특히나 어떤 트래픽 상황인지에 따라서 방법을 선택할 수 있으며, 상세 상황이 설정되지 않았을 때의 대표 처리 방법을 알아본다. 크게 5가지로 볼 수 있다

  • 단일 애플리케이션 자체의 성능 최적화
  • 서버 증설(수평 확장)과 로드 밸런싱의 적용
  • 메시지 큐 도입
  • 데이터 베이스의 복제 증설
  • 캐싱 이용

 

1️⃣. 단일 애플리케이션 자체의 성능 최적화


가장 대표적인 방법으로, 현재 애플리케이션 자체의 성능을 증가시키는 방법을 찾을 수 있다.

특히나 해당 서버의 스펙 자체가 굉장히 우수한 편인 상황에서, 애플리케이션 자체의 응답 속도가 느린 것으로 파악되었다면 필히 개선점을 찾아보아야 할 것이다. 예를 들어 내부 복잡한 로직을 단순화 시킬 수 있는 지, DB에 접근하는 쿼리를 축소 시킬 수 있는지 등 불필요한 로직과 요청의 제거를 점검한다. 또 DB 입장에서 인덱스를 적용할 Column을 분석하여 조회 성능을 향상시킬 수 있을 것이다.

 

2️⃣. 서버 증설과 로드밸런싱 설정


모니터링을 해보니 실제로 지속적인 트래픽의 증가현상이 일어나고 있음을 확인했다면 서버를 증설하는 방법을 고려할 수 있다. 서버 단일에 대한 수직 확장은 비용이 크므로, 수평적 확장을 택하고 트래픽의 분산은 로드밸런서에게 위임한다. 분산 방법은 로드밸런서의 라운드 로빈, 해싱 등으로 설정을 함으로써 한 서버에 부하가 심하게 가하지 않도록 설정할 수 있다. 덧붙여서 가장 많이 쓰는 로드밸런서로 Layer 7 단계의 nginx, Apache 등(혹은 다른 레이어인 L4 Switch라든지)이 있긴한데, Auto Scalling 기능을 활용한다면 트래픽 변화에 따라 서버 수를 자동으로 조정하여 자원 관리를 할 수 있으니 AWS나 GCP와 같은 클라우드에게 위임해보는 것도 마음 편할 테다.

 

3️⃣. 메시지 큐 적용


비동기로 처리 가능한 백그라운드 작업이 많다면 메시지큐를 아키텍처에 넣는 것을 고려할 수 있다. 가령 RabbitMQ, Kafka 등의 메시지큐가 그 예시다. 로그를 저장한다거나 이메일 발송 등에 쓰일 수 있고, 응답을 받은 애플리케이션의 외부에 위치해 데이터를 전달 받아 저장하고 있으면 해당 애플리케이션의 장애 상황에서도 안전성을 높이는 데 기여할 수 있다. 여기서 조금만 더 가보자면, RabbitMQ의 경우 데이터를 Consumer에게 갖다주는 Push형태이고, Kafka의 경우 Consumer가 데이터의 존재를 확인하고 가져가는 Polling(pull) 방식을 택하고 있다. 이 두 메시지큐의 특성상, 대규모 처리에 대해서는 Kafka와 같은 Polling 방식이 좀 더 유리할 수 있겠다.

 

4️⃣. 데이터베이스 증설


데이터베이스에 대한 읽기/쓰기 작업이 너무 많은 경우 데이터베이스를 복제시킴으로써, 사용자의 읽기 요청을 여러 서버에 분산 시키는 방법이 있다. 가령 쓰기 작업은 하나의 마스터 서버가 한다면, 그 내용을 복제 중인 다른 데이터베이스가 읽기 작업을 처리하니 읽기 성능을 개선시켜 대규모 트래픽을 분산 가능한 것이다.

 

5️⃣. 캐싱 사용하기


이번엔 캐싱 쪽으로 알아보자면, 대용량 트래픽이 특정 데이터에 대해 자주 조회하는 것으로 인해 일어나는 것일 때 고려할 수 있다. 혹은 특정 기간에 이벤트성 조회가 폭증하는 상황일 때도 포함된다.

이러한 경우에는 메모리를 이용하여 DB나 원본 서버의 부하를 줄이도록 할 수 있으며, 특히 브라우저 입장에서는 전세계에 분산된 CDN 서버중 사용자에게 가장 가까운 CDN 서버를 이용하여 정적 리소스를 제공하는 방법도 있고, Redis와 같은 인메모리 캐시를 통해 자주 접근하는 데이터를 캐싱하는 방법이 있다.

 

 

 

마무리


대용량 트래픽을 효과적으로 처리하기 위해서는 위에 언급한 다양한 방법들, 혹은 그 다른 방법들을 상황에 맞게 조합하여 적용하는 것이 필요한다. 지속적인 모니터링과 트래픽 예측을 통해 최적의 대응 방안을 마련하고, 필요에 따라 성능 테스트를 수행하여 시스템의 안정성과 효율성을 높이는 것이 바람직하다. Prometheus, Grafana, ELK stack 이라든지 이러한 모니터링 도구로 도움을 받아 적절한 조치를 취하는데 도움을 받을 수 있다.