Есть ли опыт работы с WebSocket
Что проверяют
Работали ли вы с постоянным соединением на реальном устройстве, где сеть пропадает, приложение уходит в фон, а система экономит батарею. Следом обычно просят рассказать, как было устроено переподключение и что происходило с сообщениями, пришедшими за время обрыва.
Как отвечать
Стройте ответ вокруг своего проекта: что за фича (чат, котировки, статус заказа), чем подключались и какие проблемы решали. Технический каркас:
- библиотека: чаще всего
OkHttp, вызовnewWebSocket(request, listener)иWebSocketListenerсonOpen,onMessage,onFailure,onClosed. В проектах на Kotlin Multiplatform встречается клиент Ktor; - рукопожатие: соединение начинается как HTTP-запрос с
Upgrade: websocket, сервер отвечает 101, дальше кадры идут в обе стороны по одному TCP-соединению; - живость:
pingIntervalуOkHttpClientшлёт ping-кадры и роняет соединение, если pong не пришёл. Без этого «мёртвый» сокет за NAT висит минутами; - потоки: колбэки приходят на фоновом потоке OkHttp. Удобно обернуть сокет в
callbackFlowи отдавать во ViewModelFlowсобытий, а не трогать UI из листенера; - переподключение: экспоненциальная задержка со случайным разбросом, реакция на
ConnectivityManager.NetworkCallback, после восстановления докачка пропущенного по id последнего сообщения; - жизненный цикл: сокет держат, пока экран или процесс активны. В фоне Android его всё равно усыпит, доставку туда обеспечивает FCM.
Назовите свои цифры: сколько сообщений в секунду, какой интервал ping, как часто рвалось соединение. Если опыта не было, так и скажите и опишите, как решали похожую задачу: long polling, SSE, пуши. Затем покажите, что понимаете перечисленные проблемы, это честнее придуманного чата.
Где спотыкаются
Отвечают «да, подключал OkHttp» и замолкают. Интервьюеру интересны обрывы и потерянные сообщения, а не сам вызов библиотеки.
Держат сокет в Activity. Поворот экрана пересоздаёт соединение, а неотписанный листенер держит старый экран в памяти.
Переподключаются в бесконечном цикле без задержки. На плохой сети это сажает батарею и создаёт шторм подключений к серверу, когда он поднимается после сбоя.