При переключении сети ошибка >Room already has user with such login

ndavydov

New Member
Добрый день! Засетапили сервер на yandex cloud, делаем обычный видеочат 1х1. Со всем вроде, как разобрались, при помощи ваших примеров, но возникает всего 2 проблемы

1. При переключении сети, например тоглинг vpn или переключение с мобильного интернета на wifi, возникает ошибка
Code:
joinRoom com.flashphoner.rest.server.exception.InternalErrorException, Internal Server Error, Room already has user with such login java.lang.reflect.InvocationTargetException, ts: 1730489095976, path: /apps/RoomApp/OnDataEvent
2. Если комната свежая, оба собеседника подключаются, то часто так бывает, что у второго зашедшего появляется только первый фрейм видео на экране в статичном виде, аудио в этот же самый момент работает нормально, плюс первый зашедший так же нормально видит второго зашедшего в комнату, помочь может только релоад страницы в таком случае от второго зашедшего

Заранее спасибо за помощь и наводки в решении проблемы!
 

Max

Administrator
Staff member
Здравствуйте.

1. При переключении с мобильного интернета на wifi поменяется IP адрес.
Автоматически сервер такое не отработает.
Поэтому потерю соединения можно обработать только путем полного реконнекта, который займет несколько секунд.
Т.е. при получении ошибки, нужно попробовать переподключиться к серверу еще раз
- Disconnect
- Connect

2. В правом верхнем углу есть кнопка Report.
Отравьте пожалуйста через эту форму SSH доступ к вашему серверу.
Проверим есть ли проблема.

Пример

Video Chat
Основан на простом обмене именами стримов между двумя пользователями через sendMessage() и стримами через stream.play() stream.publish().

Более продвинутый пример SFU
Можете также попробовать его. Возможно там не будет этого эффекта с отображением видео.
Документация по примеру:
 

ndavydov

New Member
Спасибо за ответ!

Насчет 1 пункта


Каждый раз, когда я переключаюсь с мобильного интернета на wifi, я перезагружаю страницу, и чтобы эта ошибка пропала нужно достаточно долго ждать и перезагружать страницу, и только после определенного перезапуска страницы оно снова работает

Насчет 2 пункта

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

ndavydov

New Member
Еще насчет 2 пункта

Event playStream каждый раз отправляется, это видно в консоли WS, то есть получается playStream есть, а самой картинки - нет
 

Max

Administrator
Staff member
Event playStream каждый раз отправляется, это видно в консоли WS, то есть получается playStream есть, а самой картинки - нет
Выглядит так, что не устанавливается WebRTC соединение через мобильную сеть. Возможно, проблема в качестве канала. Попробуйте переключться на TCP транспорт. Если это не поможет, соберите отчет, как описано здесь, и отправьте через эту форму.
 

ndavydov

New Member
В итоге, смогли починить этот момент

Решение 2 проблемы - мы вызывали playStream сразу после того, как вызывался streamPublish, мы переставили вызов playStream у уже существующих participants после того, как мы получили STREAM_STATUS.PUBLISHING, и все заработало. То есть нельзя на iOS в safari начинать проигрывать существующие стримы в комнате сразу же после подключения (по загадочным причинам)

Решение 1 проблемы с тогглом коннектов разных сетй пока не нашли, мы делаем session.disconnect() после того, как получаем эту ошибку, но все равно нужно несколько перезагрузок страницы (секунд 30-40, наверное), чтобы сервер перестал слать ошибку.

Здесь наш флоу воспроизведения таков
1. Подключаемся видим друг друга, все окей
2. Я включаю VPN/переключаюсь с wifi на мобильный интернет
3. Перезагружаю страницу
4. Вызывается RoomApi.connect
5. Приходит SESSION_STATUS.ESTABLISHED
6. Вызываем session.join()
7. Ошибка -> Internal Server Error, Room already has user with such login java.lang.reflect.InvocationTargetException
8. Вызывается session.disconnect()
9. Перезагружаю страницу несколько раз (повторяются пункты 4-8), немного жду, еще раз перезагружаю - все занимает секунд 30-40
10. Соединение устанавливается

Есть ли что-то в этом списке, что мы упускаем? Или вроде все окей и поможет можно понять только после сбора логов?
 

Max

Administrator
Staff member
2. Я включаю VPN/переключаюсь с wifi на мобильный интернет
На этом шаге сервер перестает получать ответы на пинги, отправленные в сторону клиента.
Как видно из скриншота, сервер отправляет пинги в сторону клиента через вебсокет соединение.
Периодичность отправки 5 секунд. Клиент отвечает. Если на 10 пингов не будет получено ответа, сервер считает что клиент потерял сеть и вышел из комнаты. Таким образом, повторный коннект и вход в комнату пользователя с тем же логином, может быть осуществлен не ранее чем через 50 секунд после потери соединения или смены сети.

Настройки:
keep_alive.server_interval = 5000
keep_alive.probes = 10


1731336341792.png

Таким образом, можно сократить работу пингов, например 3 пинга по 2 секунды.
В этом случае время восстановления составит до 6 секунд. Но чем короче интервал, тем больше вероятность ложных срабатываний, когда пользователь реально в сети, но до него не дошли пинги.
 

Max

Administrator
Staff member
То есть нельзя на iOS в safari начинать проигрывать существующие стримы в комнате сразу же после подключения (по загадочным причинам)
Поток с сервера начнет проигрываться не раньше, чем перейдет в статус PUBLISHING. Такова последовательность выполнения операций. Поэтому это ожидаемое поведение.
 

ndavydov

New Member
Таким образом, повторный коннект и вход в комнату пользователя с тем же логином, может быть осуществлен не ранее чем через 50 секунд после потери соединения
Не могли бы вы пояснить, почему по такой логике не работает, если я без смены сети просто перезагружаю страницу - и все окей коннектится и не надо ждать 50 секунд? Есть ли еще какой-то workaround, тк текущее решение звучит совсем не надежно и может фрустрировать пользователя, если во время видеозвонка у него просто отвалился вайфай и пришлось перейти на мобильный интернет
 

ndavydov

New Member
Может быть можно каким-то образом мануально отключать пользователя, условно я могу сделать getParticipants и знать имена всех пользователей внутри чата, я могу делать при каждом заходе на страницу какой-то постфикс к логину пользователя и кикать всех остальных с таким же префиксом из чата, то есть активная вкладка с чатом у одного логина будет всего одна, другие будут дисконнектить
 

Max

Administrator
Staff member
Не могли бы вы пояснить, почему по такой логике не работает, если я без смены сети просто перезагружаю страницу
При перезагрузке страницы браузер закрывает все связанные с ней соединения, и вебсокет коннект в том числе. Поэтому сервер сразу понимает, что данный клиент отключился, и keep alive алгоритм не работает в этом случае.
Посмотрите, пожалуйста, пример Streaming Auto Restore, там показываются все варианты, как можно диагностировать разрыв соединения на стороне клиента и восстанавливать стриминг. В том числе и фиксация смены сети на устройстве.
 
Top