Проектирование Senior Мобильный system design обновлено

Мобильный system design: SDK аналитики событий

Вопрос

Спроектируйте мобильный SDK для сбора событий аналитики: события из любого места приложения, доставка на сервер без потерь, минимальное влияние на батарею, трафик и время запуска.

Коротко

Публичный API: track(name, properties) возвращается мгновенно, запись уходит в фоновую очередь. Общие свойства (версия, платформа, сессия) добавляются автоматически.

Что должно быть в решении

  1. 1
    Требования: гарантии доставки (at-least-once), порядок, приватность, лимиты размера
  2. 2
    API SDK: неблокирующий track, общие свойства, идентификаторы, согласие пользователя
  3. 3
    Хранение: очередь событий на диске, ограничение размера, вытеснение старых
  4. 4
    Отправка: пакетами по размеру и таймеру, сжатие, ретраи с backoff, фоновые окна
  5. 5
    Идемпотентность: id события, дедупликация на сервере
  6. 6
    Влияние: ленивая инициализация, без работы на главном потоке, метрики самого SDK

Что спросит интервьюер

  • Что делать, если пользователь отозвал согласие на аналитику?
  • Как не потерять события при крэше приложения?

Разбор

Публичный API: track(name, properties) возвращается мгновенно, запись уходит в фоновую очередь. Общие свойства (версия, платформа, сессия) добавляются автоматически. SDK уважает согласие пользователя: без него события не пишутся, при отзыве очередь очищается.

Хранение: события пишутся в лёгкую базу или файл-журнал на диске сразу, чтобы пережить крэш и выгрузку. Размер очереди ограничен, при переполнении вытесняются старые события с учётом важности.

Отправка: пакетами по 50-100 событий или раз в N секунд, сжатие gzip, при старте и при уходе приложения в фон. Ошибки повторяются с экспоненциальной задержкой, успешный пакет удаляется. Каждое событие имеет id, и сервер дедуплицирует, что даёт at-least-once без дублей в отчётах. Порядок определяется временем и счётчиком внутри сессии.

Влияние: SDK инициализируется лениво после первого кадра, не делает работы на главном потоке, не будит радиомодуль ради одного события. Метрики самого SDK (размер очереди, процент доставки) отправляются тем же каналом.

Приватность: никаких персональных данных в свойствах по умолчанию, фильтр запрещённых ключей.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.