Какой протокол общения с бэкендом выбрать и почему (REST, GraphQL, WebSocket, polling)
Что проверяют
Умеете ли вы выбирать транспорт под задачу, а не по моде, и понимаете ли, как каждый вариант живёт на телефоне: с нестабильной сетью, фоновыми ограничениями и батареей. Следом обычно спрашивают, что будет при обрыве связи и когда приложение уйдёт в фон.
Как отвечать
Идите от характера данных и допустимой задержки:
- REST: запрос и ответ поверх HTTP, стандарт для CRUD. На Android это
RetrofitповерхOkHttp. Сильная сторона в зрелости: HTTP-кеш черезCache-ControlиETag, интерсепторы для токенов. Слабая: лишние поля и несколько запросов на один экран; - GraphQL: клиент сам описывает нужные поля, и один запрос собирает экран. Клиент обычно Apollo Kotlin с генерацией типов по схеме. Цена: кешировать сложнее, чем GET, а тяжёлый запрос легко положит сервер;
- WebSocket: постоянное двустороннее соединение для чатов, котировок, трекинга курьера. В
OkHttpестьWebSocketиWebSocketListener, но переподключение с растущей паузой, пинги и досылку пропущенного пишете вы; - polling: периодический опрос. Короткий прост и работает с любым бэкендом, long polling держит запрос до появления данных. Подходит, когда обновления редкие и задержка в десятки секунд не страшна.
Обязательно скажите про фон. Сокет живёт, пока экран открыт: в фоне система его закроет, а Doze режет частые опросы. Фоновые события доставляют пушами через FCM, синхронизацию по расписанию ставят через WorkManager, у периодической задачи минимальный интервал 15 минут. Частая связка: REST для данных, WebSocket при открытом экране, пуш в фоне.
Где спотыкаются
Берут WebSocket «потому что быстрее» для экрана, который обновляется раз в минуту. Соединение тратит батарею и требует серверной инфраструктуры, а выигрыша нет.
Не продумывают разрыв связи: нет переподключения и досылки событий, и после переключения с Wi-Fi на мобильную сеть чат молча перестаёт обновляться.
Считают, что GraphQL убирает лишние запросы бесплатно. Без нормализованного кеша на клиенте и ограничения сложности запросов на сервере проблема просто переезжает в другое место.