유튜브에서 kakao tech 채널의 폭증하는 카카오톡 트래픽에 대처하는 방법 (신성열 Tomo) 라는 영상을 시청하고 카카오톡의 트래픽에 대한 생각을 정리해보았다.
카카오톡의 경우
백그라운드 로그인
카카오톡은 사용자 편의성을 위해 백그라운드 로그인이라는 기능을 사용한다고 한다. 백그라운드 로그인 기능이란 한 사용자가 다른 사용자에게 메시지를 전송하는 상황에서 수신받는 사용자가 채팅방에 접속해있지 않는 상황이라면 휴대폰에서 푸시 알림을 주게 되는데, 이 알림을 받은 사용자의 휴대폰이 깨어나면서 카카오톡이 켜지고 카카오톡 서버에 로그인을 요청한다고 한다. 이런 방식을 사용하면 카카오톡을 사용할 때 따로 로그인을 하지 않고 바로 사용할 수 있다고 한다.
트래픽이 과도하게 몰리게 되는 경우?
카카오톡은 2016년 9월 경주 지진때 2시간 정도 장애가 발생했었다고 한다. 장애가 발생한 이유는 바로 백그라운드 로그인 기능 때문이었다고 하는데, 당시 긴급재난문자가 전국민에게 발송되면서 모든 사용자의 휴대폰이 켜지게 되었고, 백그라운드 로그인 기능에 따라 모든 사용자가 카카오톡에 로그인 요청을 보냈다고 한다. 이 상황에서 서버는 엄청난 수의 로그인 요청을 받게 되었고 따라서 서버의 모든 쓰레드가 로그인처리에 사용되었다고 한다.
해결 방법
앞서말한 경우처럼 예측하지 못하게 트래픽이 과도하게 몰리는 경우를 대비하여 카카오톡은 서버가 폭주하는 트래픽을 자동으로 인지하고 대응하도록 새로운 방식을 도입했다. 그 방식은 활성화된 쓰레드의 비율에 맞춰 트래픽을 인지하고 비율에 맞춰 백그라운드 로그인 차단 비율을 늘리고 줄이는 방식이다. 해당 방식으로 바로 다음해인 2017년 11월 포항 지진때는 성공적으로 대응할 수 있었다고 한다.
또 한번의 장애
카카오톡은 2020년 1월1일 다시 한번 서버에 장애가 발생하게 되는데, 이는 카카오톡의 새로운 기능과 더불어 사용자들이 신년 인사를 주고받으며 트래픽이 몰려 발생했다고 한다. 이 상황은 자동 대응 시스템으로 대응할 수 없었는데, 그 이유로는 신년 인사의 경우 백그라운드 로그인이 아닌 사용자가 직접 메시지를 전송하는 경우이기 때문이다.
교통 관리 시스템 구축
카카오톡은 이런 상황을 방지하기 위해 자동 대응 시스템과 더불어 교통 관리 시스템을 구축했다. 교통 관리 시스템은 사용자가 서버에 요청하는 각기 다른 요청마다 할당되는 쓰레드의 최대 개수를 정하는 방법이다. 예를 들어 총 100개의 쓰레드가 있는 경우 무거운 로그인 요청의 경우 50개, 메시지 전송의 경우 50개 이런 식으로 최대 쓰레드 개수를 미리 정하여 정한 쓰레드의 개수를 넘을 경우 오버플로우를 감지하여 실패하게 하는 방법이다. 이런 방법을 사용하면 일부의 로그인 실패와 메시지 전송 실패가 발생할 수 있지만 서버의 장애는 막을 수 있다고 한다.
카카오톡은 이런 경험을 바탕으로 두 가지 교훈을 얻을 수 있었다고 한다.
- 서버는 당장 필요한 트래픽만 처리하는 것이 중요하다.
- 자원을 요청별로 할당하여 특정 요청이 독점하지 못하게 해야 한다.
개인적인 생각
앞서 살펴본 카카오의 경우처럼 트래픽이 과도하게 몰리는것을 막는 가장 쉬운 방법은 우선 서버의 자원을 추가하는 방법이 있을 것이다. 하지만 이 방법을 사용하면 더 많은 트래픽을 처리할 수 있겠지만 비용적으로 매우 비싸져 효율이 떨어질 것이다.
트래픽이 과도하게 몰릴만한 서비스를 운영해본 경험이 없기 때문에 카카오톡의 경우를 생각해 트래픽 폭증을 막는 방법에 대해 생각해보았다.
새로운 조건 추가
카카오톡의 백그라운드 로그인의 경우 휴대폰이 켜지면 자동적으로 카카오톡이 실행되며 서버에 로그인 요청을 보내 트래픽이 폭증한다고 하였다. 그렇다면 로그인 요청을 보내는 조건을 추가하면 되지 않을까?
긴급재난문자의 푸시 알람과 같이 휴대폰이 켜지는 상황을 로그인 요청을 위한 첫번째 조건으로 설정하고 사용자의 휴대폰 잠금해제를 두번째 조건으로, 휴대폰 조작이 몇초 이상 지속되는 것을 세번째 조건으로 설정하여 세 가지 조건을 모두 만족하는 경우에만 로그인 요청을 보내는 방식이다.
예시로 모든 사용자에게 긴급재난문자가 전송되어 푸시 알람으로 모든 사용자의 휴대폰이 켜졌다. 이 중 일부는 문자를 확인만 하고 휴대폰의 잠금을 해제하지 않아 로그인 요청을 보내지 않는다. 또 다른 일부는 휴대폰을 잠금해제하였지만 조작 시간을 만족하지 못하여 로그인 요청을 보내지 않는다. 나머지의 경우 세 가지 조건을 모두 만족하여 로그인 요청을 보낸다.
이런 방식으로 백그라운드 로그인 요청에 관한 조건을 세세하게 설정한다면 긴급재난문자 같은 트래픽에 대응하기 좀 더 쉬울 것으로 예측된다.