Мессенджер работал в режиме онлайн или с задержкой
Что проверяют
Понимаете ли вы, как сообщения на самом деле доходили до устройства в вашем проекте, или знаете только экран чата. За вопросом стоит проверка транспорта, работы в фоне и офлайна. Следом обычно спрашивают, что происходило с сообщением, отправленным в метро без сети, и как вы избегали дублей.
Как отвечать
Сначала честно ответьте на сам вопрос: был ли постоянный канал или сообщения приходили с задержкой через пуши и опрос. Затем разложите схему:
- активный экран: постоянное соединение, чаще WebSocket через OkHttp, с пингами и переподключением с экспоненциальной задержкой;
- фон: держать сокет в фоне Android не даст, Doze и ограничения фоновой работы его оборвут. Поэтому сервер шлёт FCM, приложение показывает уведомление или просыпается и дотягивает новые сообщения по API. Полезная нагрузка пуша ограничена 4 КБ, так что это сигнал, а не канал доставки;
- офлайн и отправка: Room как источник правды, исходящие пишутся в таблицу со статусом (отправляется, отправлено, доставлено, прочитано), а отправку повторяет WorkManager с ограничением на наличие сети;
- идемпотентность: клиент генерирует идентификатор сообщения, и сервер по нему отбрасывает повтор, если ответ потерялся и клиент отправил ещё раз;
- порядок и синхронизация: сортировка по серверному номеру, а не по времени телефона, и догрузка пропущенного с последнего известного идентификатора после переподключения.
Если транспорт делала бэкенд-команда, так и скажите и расскажите, за что отвечали вы: кэш, статусы, интерфейс при плохой сети. Пример из своего проекта ценнее общей схемы.
Где спотыкаются
Называют FCM способом доставлять сообщения мгновенно. Высокоприоритетный пуш обычно приходит быстро, но гарантий нет: система может понизить приоритет, а пользователь мог ограничить приложению фоновую работу.
Пытаются держать соединение сервисом в фоне. Современный Android требует для этого foreground service с объявленным типом и видимым уведомлением, для мессенджера это обычно лишнее.
Не думают о дублях и порядке. Без клиентского идентификатора повтор даёт два одинаковых сообщения, а сортировка по времени телефона путает переписку при сбитых часах.