Использовали ли XMPP или похожие протоколы
Что проверяют
Опыт с долгоживущими соединениями и доставкой сообщений на Android, а не знание аббревиатуры. XMPP встречается редко, поэтому засчитывают и работу с похожими инструментами. Следом спрашивают, как вы держали соединение в фоне и как не теряли сообщения.
Как отвечать
Кратко про протокол: XMPP это открытый стандарт обмена сообщениями и статусами поверх постоянного соединения, обычно TCP на порт 5222. Клиент и сервер обмениваются XML-потоком, адрес пользователя это JID вида user@domain/resource, данные ходят тремя типами станз: <message>, <presence> и <iq>. Остальное добавляют расширения (XEP): подтверждения доставки, архив сообщений MAM, возобновление потока Stream Management, групповые чаты MUC, пуш-уведомления. На Android клиентом обычно берут Smack, серверы: ejabberd, Prosody, Openfire.
Затем главное, про Android:
- фон: держать сокет вечно нельзя. Doze, App Standby и ограничения фоновой работы рвут соединение, поэтому сервер будит клиента высокоприоритетным пушем через FCM, а приложение подключается и забирает сообщения;
- сеть: переподключение с экспоненциальной задержкой по событиям
ConnectivityManager.NetworkCallback, возобновление потока без повторного входа; - надёжность: у сообщения клиентский id, по нему сервер и клиент убирают дубли, а неотправленное лежит в локальной очереди (Room) до подтверждения.
Похожие протоколы: MQTT для лёгкого pub/sub с уровнями QoS, WebSocket через OkHttpClient.newWebSocket(), стриминг в gRPC. Если XMPP не использовали, так и скажите и расскажите про то, с чем работали: задачи переподключения, очереди и дублей там те же. Добавьте свои цифры, например число пользователей.
Где спотыкаются
Говорят, что WhatsApp работает на XMPP. Он вырос из доработанного ejabberd, но давно использует собственный бинарный протокол, так что этот пример лучше не приводить.
Сравнивают XMPP с WebSocket как конкурентов. WebSocket это транспорт, и XMPP умеет работать поверх него.
Предлагают держать соединение в вечном сервисе. На современных версиях Android такой сервис убьют или потребуют foreground service с уведомлением и объявленным типом, а пользователь заметит расход батареи.