카카오의 기술 이야기
카카오톡은 대한민국에서 가장 많은 트래픽이 발생하는 서비스 중 하나입니다. 신년이나 크리스마스 같은 특별한 날에는 축하의 말을 전하기 위해, 불꽃놀이 같은 큰 행사가 있는 날에는 영상이나 사진을 보내기 위해 카카오톡을 사용합니다. 또, 지진 같은 국가적 재난에는 서로의 안부를 묻거나 사건 소식을 전하다 보니, 카카오톡 트래픽이 상상을 초월할 만큼 많아집니다. 이처럼 특별한 날 폭증하는 이례적인 트래픽을 관리하기 위해 카카오톡팀 개발자들은 어떤 방법을 사용하고 있을까요?
2011년 10월, 3G 시대가 열리며 하루 6억 건에 달하는 메시지를 지연 없이 전송하기 위해 카카오톡에서는 겁나 빠른 황소 프로젝트를 진행했습니다. 전 국민이 사용하는 덩치 큰 앱으로 성장한 카카오톡이 속도에서도 가장 빠른 메시지 전송 수단이 되자는 목표가 담겨 있었습니다.
6년이 지나 LTE 시대가 된 지금, 카카오톡은 하루 80억 건 이상의 메시지를 전송하는 서비스가 됐습니다. 커진 규모에 걸맞게 꾸준히 시스템을 개선해 나가고 있습니다. 그 결과, 어떤 채팅 앱보다도 빠르고 안정적인 서비스를 유지하고 있습니다.
전 국민이 사용하는 서비스인 카카오톡에서는 예상치 못한 트래픽 폭증이 발생하기도 합니다. 2016년 경주 지진 같은 경우입니다. 당시 트래픽이 급증하며 메시지 전송이 어려워지기도 했습니다. 반면, 2017년 11월 15일 포항에서 리히터 규모 5.5의 강진이 발생했을 때에도 카카오톡 트래픽은 폭등했습니다. 하지만, 이전과는 달리 정상적으로 메시지를 송수신할 수 있었습니다. 카카오톡팀 개발자들은 어떻게 트래픽에 대응했을까요?
카카오톡 연결의 원리
카카오톡으로 대화를 주고받으려면 카카오톡과 서버가 연결돼 있어야 합니다. 카카오톡을 처음 서버와 연결할 때는 로그인을 합니다. 이때 인증절차, 대화를 가로채지 못하도록 암호화된 통신 채널 생성, 그동안 나에게 온 메시지를 확인해 핸드폰에 받아 놓는 등 다양한 과정을 거칩니다. 그렇기 때문에 카카오톡을 서버와 연결할 때는 약간의 시간이 걸립니다.
카카오톡과 서버의 연결은 자주 끊어집니다. 우리가 이동할 때나, 스마트폰을 사용하고 있지 않을 때 같은 경우입니다. 카카오톡은 하루에도 수십 번씩 사용하는 서비스입니다. 이때마다 위의 과정을 거쳐 새롭게 연결을 해야 한다면 접속 시간이 오래 걸려 사용성을 해칠 것입니다.
카카오톡팀 개발자들은 사용자가 카카오톡을 직접 켜서 사용하지 않더라도 꾸준히 카카오톡과 서버가 연결돼 있도록 해두었습니다. 예를 들어 지인으로부터 카카오톡 메시지가 오면, 카카오톡과 서버가 연결을 시도하도록 한 것입니다. 이처럼 평상시에도 수시로 카카오톡과 서버를 연결해 두기 때문에 사용자가 실제 카카오톡을 열어 메시지를 확인할 때에는 즉시 새로 온 메시지를 볼 수 있습니다. 물론 데이터 사용을 최소화하기 위해 모든 과정을 최대한 가볍게 진행합니다.
가설의 수립: 카카오톡 메시지 전송 트래픽은 높지 않았을 것
카카오톡이 감당하기 어려울 수준으로 트래픽이 폭증한 사건이 있었습니다. 2016년 9월 12일 오후 7시 44분, 경주에서 리히터 규모 5.1의 지진이 발생한 것입니다. 서버로 연결을 맺으려는 트래픽이 평소 대비 40~50배까지 올라갔습니다. 카카오톡이 정상화되기까지는 2시간 이상이 걸렸습니다.
카카오톡팀 메시징 개발자들은 지진 당일 폭증한 트래픽을 분석했습니다. 무슨 일이 있었기에 이렇게 트래픽이 폭증했을까? 카카오톡이 국민 소통의 도구가 되었다고 하지만, 지진에 대피하는 와중에도 안부를 묻고 소식을 전하기 위해 전 국민이 동시에 카카오톡을 실행하고 있었을까? 그래서 당시 언론 보도를 통해 확인할 수 있었던 시간 별 상황과 서버의 기록을 대조하며 한 가지 가설을 세웠습니다.
재난 문자가 대량 발송되며 이를 수신한 스마트폰이 일제히 깨어나 카카오톡 서버와 연결을 맺으려 했다. 엎친데 덮친 격으로 이동통신사의 통신망에도 단절이 발생하며 전국의 수많은 스마트폰 속의 카카오톡은 서버와 연결이 끊어졌을 것이다. 그 결과 몇 백만 이상의 카카오톡이 서버와의 연결을 복구하려고 했고, 이 과정이 반복되며 트래픽이 눈덩이처럼 불어나 평소 대비 몇십 배까지 올라간 것은 아닐까? 그렇다면 실제로 메시지를 보내려던 사람의 수는 감당 가능한 수준이 아니었을까?
가설이 맞다면, 트래픽이 폭증하는 재난 상황에서 실제 메시지를 보내려는 사용자가 카카오톡을 먼저 이용할 수 있게 하고, 빠른 통신을 위해 연결을 미리 맺어 놓는 상황은 잠시 미룬 후 처리해도 될 것으로 봤습니다.
가설의 검증: 카카오톡 사용자 집단의 구분
가설을 검증하기 위해 두 집단을 구분해야 했습니다.
1) 카카오톡을 이용해 메시지를 보내고 있던 집단
2) 사용자가 카카오톡을 직접 실행하지 않고, 백그라운드에서 카카오톡과 서버의 연결을 유지하기 위해 접속을 시도했던 집단
이전까지는 사용자 집단이 구분되어 있지 않았습니다. 사용자 행태 데이터를 분석해 두 집단을 나누는 기준을 찾을 수 있었습니다. 사용자의 접속 유지 시간을 초 단위로 나누어 보니, 앞뒤의 ±1초 보다 몇십 배나 많은 사용자가 동시에 접속이 끊어지는 구간이 있었습니다.
쉽게 말해, 지진이 일자 1) 급증하는 트래픽, 2) 통신망 장애, 3) 서버와 연결을 시도하다 난 타임아웃 같은 '여러 가지 프로그램적인 요인에 의해 실제 카카오톡을 사용하지는 않지만 서버와 접속이 유지되었던 수많은 기기가 동시에 접속이 끊긴 것'입니다. 이 기기들은 즉각적으로 서버와 연결을 복구하려는 시도를 하며 트래픽을 눈덩이처럼 증가시켜 갔습니다.
이처럼 외부 요인에 의해 접속이 종료된 카카오톡을 서버와 연결하는 처리를 잠시 뒤로 미룬다면, 실제 카카오톡을 사용하고 있는 트래픽만을 먼저 처리할 수 있고, 전체 트래픽 증가 속도를 낮출 수 있다고 봤습니다.
분석 결과, 사용자가 직접 앱을 실행한 비율은 대략 40% 정도, 그렇지 않은 경우는 60% 정도로 예측할 수 있었습니다. 60%의 접속을 비상 상황에 잠시 미루어 처리하기로 했습니다. 이 경우에도 사용자는 몇 초 느려진 정도로 카카오톡을 이용할 수 있었습니다. 국가 비상상황에서는 충분히 감당할 수 있는 수준으로 보였습니다.
시스템의 개선: 실제 사용자에게 집중하다
예측치를 바탕으로 시스템을 개선했습니다. 우선 비상 상황을 자동으로 감지할 수 있는 기능을 보강했습니다. 1) 사용자가 앱을 직접 실행한 상황(Foreground, FG)과, 2) 여러 가지 이유로 백그라운드에서 서버로 연결하는 상황(Background, BG)을 구분했습니다.
앱을 직접 실행한 경우는 우선 처리해야 하는 트래픽으로 봤습니다. 비상 상황이 감지되면 FG는 처리하고, BG는 비상 상황의 단계에 따라서 뒤로 미뤄서 처리하도록 했습니다.
실제 개선사항을 적용해보니 평상시 빠른 접속을 돕는 BG의 비율은 예상보다 높은 80% 이상이었습니다. 비상시 기능이 제대로 작동한다면 예상보다 큰 효과가 있을 것 같았습니다. 유사한 상황이 발생한다면, 기능이 잘 작동해 사용자들이 카카오톡을 이용해서 안부를 묻고 소식을 전하는데 조금이나마 도움이 되기를 바라고 있었습니다.
결과: 폭증하는 트래픽에 원활하게 대응한 카카오톡
2017년 11월 15일 오후 2시 29분 31초 포항에서 규모 5.5의 지진이 발생했습니다. 지진 발생 30초 후 접속 요청은 5배 이상 폭증했습니다. 이 상황에서 BG의 비율이 96%까지 올라갔습니다.
부하가 걸린 서버는 평소보다 응답이 느려졌습니다. 이를 감지한 시스템은 즉시 비상 상황 모드로 전환하여 자동으로 4%의 FG 트래픽을 먼저 처리하면서 BG 트래픽을 컨트롤했습니다.
약 1분 후, 정상 속도로 응답을 줄 수 있을 만큼 트래픽을 관리하는 데 성공했습니다. 이 1분 동안 일부 이용자가 메시지와 사진을 주고받는데 지연이 있었지만, 곧 대부분이 원활하게 카카오톡을 이용할 수 있었습니다.
만약 BG 트래픽을 적시에 자동으로 컨트롤하지 못했다면, 정상적으로 접속해 있던 이용자들도 응답이 늦어지며 기존의 연결을 끊고 다시 연결을 시도했을 것입니다. 이런 상황이 누적되면 경주 지진 때처럼 전면 장애로 이어졌을지도 모릅니다.
새해 첫날에도 긴장을 늦출 수 없었습니다. 1월 1일에는 새해 인사를 전하는 카카오톡 메시지가 오가며 평소 대비 트래픽이 월등이 높아지기 때문입니다. 역시나 새해로 넘어가는 2018년 0시에도 트래픽이 평소에 비해 3배 정도 급증했고, 메시지를 보내는 사용자가 카카오톡을 원활하게 쓸 수 있도록 우선적으로 처리하였습니다.
11월 15일 두 번의 지진과 수능 연기 소식이 발표될 때, 그리고 신년 카운트다운을 할 때 평소보다 훨씬 많은 트래픽이 유입되었지만, 카카오톡은 이상 없이 서비스되었습니다.