페이스북의 모바일 메신저 철학은?

일반입력 :2014/10/13 12:04    수정: 2014/10/13 13:06

“고성능 실시간 모바일 애플리케이션을 구축할 때 ‘네트워크는 항상 부족하며, 최대한 효율적으로 사용해야 하는 자원’이란 점을 상기해야 한다.”

페이스북의 백엔드 인프라를 담당하는 엔지니어링팀이 모바일 중심의 메신저 개발에 대한 자신들의 철학을 밝혔다.

최근 페이스북 엔지니어링팀은 블로그를 통해 메신저 서비스의 백엔드 인프라 개선 사례를 공유했다.

페이스북은 7월말부터 모바일 기기의 메신저 서비스를 페이스북 공식앱에서 분리했다. 사용자는 모바일기기로 페이스북 채팅을 할 때 메신저 앱만 사용해야 한다. 이는 페이스북 내부의 개발조직에도 상당한 부담으로 작용했다. 유선 인터넷과 데스크톱 웹에서 발달한 페이스북 메신저 서비스를 모바일 중심으로 개편하는 작업이 쉽지 않았단 얘기다.

페이스북 엔지니어링팀은 “모든 버려지는 바이트는 앱의 경험에 상당한 영향을 준다”며 “적은 데이터를 보내고, HTTPS를 끌어오는 것을 줄이게 되면, 앱은 업데이트를 빠르게 받으면서 더 높은 가용성을 보이게 된다”고 강조했다.

이어 “푸시 가능한 기기를 위해 설계된 프로토콜로 새로운 모바일 중심 인프라를 구축하는 게 더 나은 경험을 준다”고 덧붙였다.

페이스북에 따르면, 옛 페이스북 메신저 서비스의 백엔드 시스템은 모바일을 염두에 두고 설계되지 않았다. 이에 따라 메신저 성능이 느려지고 데이터 사용량이 증가하는 현상을 낳았다고 한다. 특히 네트워크 상에서 데이터 비용을 갉아먹고, 대역폭을 제한한다는 점이 문제였다.

페이스북 엔지니어링팀은 “이를 고치기 위해 어떻게 기기에서 데이터를 동기화할 것인지, 어떻게 데이터가 새로운 동기화 프로토콜을 지원하는 백엔드에서 처리될지 다시 생각해야 했다”고 밝혔다.

메신저 앱 개발팀이 모바일에 맞는 사용자인터페이스(UI)와 기능을 추가하는 동안 인프라 담당 조직은 높은 신뢰성과 데이터 전송량을 최소화하는 백엔드 시스템을 개발했다.

그리고 메신저 앱을 위한 새로운 메신저 동기화 프로토콜을 만들어 적용했다. 그 결과 미디어 형태가 아닌 데이터의 네트워크 사용량을 40% 줄였다고 한다. 네트워크 혼잡을 줄임으로써 메시지 전송에러를 겪는 사용자 수도 20% 가량 줄었다. 새 서비스에 사용된 기술은 '아이리스'라 이름 붙였다.

새 클라이언트와 백엔드 시스템은 풀(Pull) 기반에서 푸시(Push) 기반으로 변경됐다.

종전 단말기의 메신저 앱은 서버에 복잡한 HTTPS 쿼리를 전송하고, 업데이트된 대화 전체를 대용량의 JSON 포맷으로 받았다. 엔지니어링팀은 푸시 기반의 스냅샷+델타 모델을 사용하기로 결정했다. 앱은 메시지의 첫 스냅샷을 탐색하고, 변화값 업데이트를 정기적으로 받는다.

서버는 MQTT 프로토콜로 메시지를 받아 앱에 즉각 푸시한다. 클라이언트는 업데이트 값을 받아 단순히 스냅샷의 로컬 복제에 접속한다. 결과적으로 HTTPS 요청을 만들지 않고, 앱은 빠르게 최신 정보를 보여줄 수 있다는 설명이다.

이와 함께 JSON 인코딩도 대체하기로 했다. JSON 포맷이 비효율적이란 판단 때문이었다. 엔지니어링팀은 JSON 대신 스리프트(Thrift)를 사용하기로 결정했고, 유선 상의 페이로드 크기가 거의 50% 감소했다고 한다.

서버 시스템 단계에선 디스크와 앱에 동기화 기법을 적용했다. 이전의 풀 기반 모델은 메신저 앱을 가동하는 신호를 보내기 전 디스크에 새 메시지를 썼다. 대규모 스토리지 계층이 전체 대화뿐 아니라 실시간 메시지 데이터 서비스까지 담당해야 했던 것이다. 이는 실시간으로 메시지를 앱과 디스크 양단에서 효율적으로 동기화하지 못하게 만들었다.

엔지니어링팀은 아이리스를 활용해 신규 메시지, 메시지 읽음 상태 변경 등의 메시지 업데이트 큐를 명령하게 했다. 큐 안에는 두 개의 포인터가 각각 존재해 스토리지와 메신저 앱에 동시에 업데이트를 보낸다. 성공적으로 메시지가 디스크나 단말기로 전송될 때 해당하는 포인터가 새로운 위치로 바뀌게 된다.

휴대폰이나, 디스크 둘 중 하나가 꺼져있을 때 포인터는 새로운 메시지를 대기행렬에 위치시키고, 다른 포인터의 상태가 바뀔 때까지 기존의 자리를 유지한다. 디스크에 쓰이기까지 단말기의 앱은 새 정보를 계속 받을 수 있다.

관련기사

가령, 누군가 메시지를 보냈는데 앱이 꺼져 있다면 우선 디스크에 쓰고, 앱을 켰을 때 새 정보를 보여주게 된다. 앱의 포인터는 그때 가장 최신의 위치로 옮겨간다. 디스크가 작동하지 않는다면, 앱에는 메시지를 보내고 디스크가 활성화될 때까지 디스크 쪽에 새 정보를 보내는 걸 대기시켰다가 디스크 활성화 시 업데이트를 저장하고, 포인터도 새로 바뀌는 것이다.

페이스북은 메시지 큐를 마이SQL과 플래시 상에 설치했다고 밝혔다. 마이SQL의 반동기화복제(semi-sync replication)을 사용했다. 이 기술을 통해 데이터베이스 하드웨어 장애를 30초 미만으로 제어하게 됐고, 메신저는 더 빠르고 더 안정적으로 데이터를 받을 수 있게 됐다고 강조했다.