Пользователи зависают

Ras2607

Member
Добрый день!
Столкнулись с проблемой в roomApi
Иногда, по непонятной причине участники подвисают в комнате, несмотря на то, что на самом деле из нее вышли.
Они остаются в списке участников до перезагрузки сервера.
Самое тут противное то, что с тем же именем уже система не дает войти в комнату, говорит что дубликат.

Собственно вопросы: как избежать такого поведения и есть ли инструмент для принудительной очистки комнаты от зрителей (конкретного или хотя бы все разом) ?
 

Max

Administrator
Staff member
Добрый день.
Выход из комнаты может зависать по двум причнам:

1. Пользователь неожиданно завершил соединение, например потерял TCP коннект в случае проблем с интернетом.
В этом случае дисконнект должен пройти по keep_alive в настройках server.properties
Время дисконнекта по keep alive: 50 секунд.

2. На серверной стороне в Room App произошла ошибка и пользователь остался висеть.
В этом случае можно попытаться его дисконнектить принудительно с помощью
Code:
/rest-api/connection/terminate
https://flashphoner.com/docs/wcs5/wcs_docs/html/en/wcs-rest-api/index.html?examples.htm

или хотя бы все разом
Для этого нужно выбрать всех и решить каких из них требуется дисконнектить
Code:
/rest-api/find_all
Они остаются в списке участников до перезагрузки сервера.
Это указывает на ошибку.
Соберите логи за последние несколько часов, когда такое происходит и пришлите на logs@flashphoner.com
Проверим.
Нужны логи:
  • WCS_HOME/cdr
  • WCS_HOME/conf
  • WCS_HOME/logs/server_logs/flashphoner.log + логи за последние несколько часов
  • WCS_HOME/logs/server_logs/flashphoner_manager.log + логи за последние несколько часов
 

Ras2607

Member
Проблема вернулась. Возможно была и раньше, но никто не жаловался.

На всякий случай описываю симптомы еще раз, только версия теперь 5.2.515.
Пользователь подключается к roomApi через
Code:
connection = Flashphoner.roomApi.connect({urlServer: url, username: username})
Подключение проходит успешно.
Далее выполняется вход в комнату
Code:
connection.join({name: getRoomName()})
И вот здесь в случае зависания пользователя выскакивает событие ROOM_EVENT.FAILED с ошибкой Conflict.

Проблема в том, что отключить такого пользователя через /rest-api/connection/terminate не получается, потому что его соединения тут просто нет!
Искали следующим образом.
Получили список соединений /rest-api/connection/find_all и в поле sessionId отображаются вначале ip адреса. Адреса зависшего пользователя там нет, только реально подключенные.
При этом в случае если получить список пользователей через room.getParticipants(), то пользователь там числится.


Добавлю что по таймауту такой пользователь тоже не отваливается. Пробовали и стандартные настройки и вручную меняли client_timeout=300000 и session_idle_timeout=60000.
Помогает только перезагрузка wcs
 
Last edited:

Ras2607

Member
Исключили ошибку в поиске соединения.
Комната пустая, в getParticipants() пользователь числится один.
/rest-api/connection/find_all выдает Not Found
но войти нельзя - Conflict
 

Max

Administrator
Staff member
Добрый день.
Увидели проблему в логах, создали внутренний тикет WCS-2573, о результатах сообщим здесь.
 

Ras2607

Member
Здравствуйте!
Есть ли решение по проблема зависших пользователей?
У нас до сих пор переодически это происходит
 

Max

Administrator
Staff member
Добрый день.
Дело в том, что в тестовом окружении проблема практически не воспроизводится, за исключением экзотических способов вроде блокировки loopback-трафикав момент выхода пользователя из комнаты. В связи с этим, рекомендуем проверить, не блокируется ли loopback-трафик на Вашем сервере в моменты, когда пользователи выходят из комнат.
В данный момент возможный фикс находится на тестировании.
 

Ras2607

Member
А можно чуть подробнее, как это может проявляться?
Нет достаточно опыта у специалистов.
Специально мы точно ничего подобного не настраивали, чистый vds использовался для установки WCS
 

Max

Administrator
Staff member
А можно чуть подробнее, как это может проявляться?
У вас при отключении пользователя летит исключение в логах
Code:
10:26:24,167 ERROR           RestClient - API-ASYNC-pool-12-thread-18 Got exception in REST 
java.net.SocketException: Connection reset
...
как будто соединение на localhost:8081 было сброшено
В тестах мы это смогли воспроизвести, только закрывая трафик на localhost
Code:
iptables -I INPUT 1 -i lo -s 127.0.0.0/8 -d 127.0.0.0/8 -p tcp --dport 8081 -j REJECT
и то в этом случае мы получаем Connection refused
Поэтому проверьте, пожалуйста, нет ли на том же сервере еще одного сервиса, который бы пересекался по портам с WCS. Также обратите внимание на загрузку процессора в моменты, когда проблема воспроизводится.
 

Ras2607

Member
Сомневаюсь, что мы что-то найдем.
На сервере нет ничего, кроме WCS, чистая Ubuntu 16.04.
При проверке портов 8081 слушает только java

Так что ждем фикса, напишите пожалуйста когда он будет готов.

Еще вопрос - возможно ли, что подобная ошибка возникает из-за не правильного использования API (и web и REST)?
Может нам надо пересмотреть код на своей стороне?
 

Max

Administrator
Staff member
Еще вопрос - возможно ли, что подобная ошибка возникает из-за не правильного использования API (и web и REST)?
При неправильном использовании API результат будет не тот, что ожидается.
Но один нюанс есть. Если участников в одной комнате слишком много (например, подкаст и 700 слушателей), встроенный бэкенд WCS может с такой нагрузкой уже не справиться и, например, рассылка сообщения всем слушателям может не работать. В таких случаях мы рекомендуем реализовывать собственный бэкенд на отдельном сервере, но RoomApi так работать уже не будет, нужно будет переписать его, используя обмен данными на REST hook. Пример использования обсуждается в этой теме.
 

Max

Administrator
Staff member
Добрый день.
Мы выпустили исправление для подключения пользователей после выхода из комнаты в сборке 5.2.631.
Пожалуйста, обновите сервер, добавьте в файл log4j.properties строки
Code:
log4j.logger.com.flashphoner.rest.server.apps.room.Room=DEBUG
log4j.logger.com.flashphoner.rest.server.apps.room.RoomApp=DEBUG
чтобы вывести отладочную информацию на случай, если проблема будет воспроизводиться.
Отметим также, что, если сервер не получил сообщения при выходе пользователя, он определяет, активно ли соединение со стороны клиента, поэтому при выходе пользователя из комнаты необходимо закрыть соединение:
Code:
function onLeft() {
    ...
    $('#sendMessageBtn').prop('disabled', true);
    $("#localStopBtn").prop('disabled', true);
    $("#localAudioToggle").prop("disabled", true);
    $("#localVideoToggle").prop("disabled", true);
    unmuteConnectInputs();
    connection.disconnect();
}
 
Top