요즘 비즈니스에 푸시 기술은 필수 기능이라서 도움이 될 거 같아 Uber 실시간 푸시 플랫폼 기술에 대한 설명과 Uber가 어떻게 푸시 플랫폼을 진화시켰는지에 대해 기술되어 있는 Uber’s Real-Time Push Platform라는 글을 번역해 보았습니다.
Uber는 매일 전세계에서 수백만 건의 여행 데이터를 처리를 통해 다방면의 마켓플레이스를 구축하고 있다. 우리는 모든 사용자를 위해 실시간 환경을 구축하기 위해 노력하고 있다.
실시간 마켓플레이스의 특성은 모든 사용자들에게 매우 활기차게 만든다. 여행중에서는 진행 중인 여행의 상태를 수정하고 볼 수 있으며 실시간 업데이트가 필요한 사용자들이 많다. 픽업 시간, 도착 시간, 화면 경로 등 모든 엑티브한 참가자들의 앱을 실시간으로 정보를 동기화가 필요하고 앱이 활성화가 되었을 경우에는 가까운 운전자 정보가 제공 되어야 한다.
사용자 화면에서 많은 중요한 기능의 증가와 더불어 사용자의 앱 화면에 분산된 방식으로 실시간 환경의 모바일 앱 기능을 구축해야하는 개발자들의 필요성이 성장을 위한 핵심 키포인트이다.
이번 포스트는 우리가 앱의 새로고침 기능을 폴링 방식에서 gRPC 기반의 양방향 스트리밍 방식으로 우리 앱에 어쩧게 구축해 갔는지에 대해 기술한다.
폴링 방식의 업데이트
Uber 트립은 라이더와 같은 참여 주체들과 실세계에서 이동하는 운전자들 사이의 조율이다. 이 두 엔티티(라이더와 운전자)는 백엔드 시스템과 여행이 진행되는 동안 서로 최신 상태를 유지해야 한다.
탑승자가 승차 요청을 했고 운전자가 서비스를 제공하기 위해 온라인 상태인 시나리오를 생각해 보자. 백엔드에 있는 Uber의 매칭 시스템은 일치하는 것을 식별하고 운전자에게 여행 정보를 제공한다. 이제 모든 사람(라이더, 드라이버, 백엔드)이 서로의 의도에 맞게 동기화되어야 한다.
드라이버(운전자) 앱은 몇 초마다 서버로 폴링하여 이용 가능한 새로운 오퍼(요청)가 있는지 확인한다. 라이더(탑승자) 앱은 몇 초마다 서버로 폴링하여 드라이버(운전자)가 할당되었는지 확인할 수 있다.
앱들의 폴링 빈도는 폴링하는 데이터의 변경률에 따라 달라진다. Uber 앱과 같은 대형 앱에서, 변경율에 대한 변화폭은 몇 초에서 몇 시간까지 매우 다양하다.
모바일 앱에서 폴링하는 문제
어느 시점에서는 백엔드 API 게이트웨이 요청의 80%가 폴링 호출이었다.
적극적인 폴링은 앱의 응답성을 유지하지만, 서버 리소스 이용률이 높아진다. 폴링 빈도에 버그가 있으면 백엔드 로드가 증가하고 성능이 크게 저하된다. 실시간 동적 데이터가 필요한 기능의 수가 증가함에 따라 백엔드에 상당한 부하가 계속 증가되기 때문에 이 접근 방식은 실현 불가능했다.
폴링은 더 빠른 배터리 소모, 앱에 느려지고, 네트워크의 혼잡으로 이어진다. 이는 특히 2G/3G 네트워크에서나 도시 전체에 스팟 네트워크가 있는 장소에서는 앱이 폴링을 여러번 시도를 한다.
기능의 수가 증가함에 따라 개발자들은 기존 폴링 API를 오버로드하거나 새로운 폴링 API를 만들려고 했다. 피크시에는 그 앱은 수십 개의 API를 폴링하고 있었다. 각 API는 여러 기능으로 오버로드 되어 있다. 이러한 폴링 API는 결국 앱이 기능을 폴링하기 위한 페이로드 공유 API의 집합이 되었다. API 수준에서 일관성 및 논리적 관심 분리를 유지하는 것은 난제가 되어갔다.
앱의 초기 구동시에 폴링 전략에서 가장 어려운 시나리오였다. 앱을 열 때마다 모든 기능이 백엔드에서 최신 상태를 끌어와 UI를 렌더링하기를 원했다. 이로 인해 여러 개의 API를 동시에 호출해 경쟁이 발생했으며 중요한 콤포넌트가 서버에서 도달될때까지 앱을 렌더링할 수 없었다. 우선 순위 지정 없이 모든 API에 중요한 정보가 일부 포함되어 있었기 때문에 앱 로드 시간이 계속 증가했다. 열악한 네트워크 조건은 초기 구동시간을 더욱 악화시킬 것이다.
마켓플레이스의 다양한 참여자들 사이에서 상태를 동기화하는 방법에 대한 완전한 혁신이 분명하게 필요했다. 우리는 서버가 온디맨드 방식으로 앱에 데이터를 전송할 수 있는 기능을 갖춘 푸시 메시징 플랫폼을 구축하기 위한 여정에 착수했다.
이 아키텍처를 채택함에 따라 효율성이 크게 향상 되었지만 다양한 문제 및 과제들을 해결해야 했다. 다음 섹션에서는 다양한 세대의 푸시 인프라와 이 플랫폼이 어떻게 발전했는지 설명하고자 한다.

