Мертвые сессии в Apache Mina - PullRequest
       26

Мертвые сессии в Apache Mina

3 голосов
/ 22 сентября 2011

У нас есть GPRS-шлюз на базе Apache Mina (сервер).Иногда, обычно, когда соединение жестоко прерывается со стороны клиента, т. Е. Когда кабель питания отключен или происходит какое-либо другое необычное отключение или какая-либо проблема с сетью, он не удаляется и не закрывается на стороне сервера.Он остается там, в бездействующем состоянии, потому что я не знаю, как долго (может быть, навсегда).Временами мы сталкиваемся с проблемами при выключении сервера, MINA отнимает слишком много времени, а иногда нам приходится со временем его убивать.Мы подозреваем, что эта проблема связана с проблемой отсутствия связи.
На самом деле, эта мертвая связь имеет смысл.Так как соединение жестоко закрыто, и у mina нет способа проверить это (так работает сеанс tcp).Мы, как обходной путь, разработали решение, которое закроет сессию, если она будет бездействовать (и читать, и писать), скажем, 30 минут (или любое настраиваемое время).Что нам не нравится по двум причинам:
1- Это не выглядит красиво.
2 - Плюс у нас есть правило, что клиент устанавливает постоянное соединение с сервером.Таким образом, немного трудно установить «тайм-аут простоя», так как мы не можем просто закрыть любой сеанс, который простаивал в течение х мин / ч, поскольку это может быть допустимое соединение.

Итак, есть ли более хороший и более безопасный (в нашем случае) способ обнаружить и очистить эти мертвые соединения в MINA?

1 Ответ

1 голос
/ 22 сентября 2011

В обоих случаях длительное не активное соединение и потерянное соединение - отсутствие активности в канале должно привести к тайм-ауту после настроенного времени на каждом уровне модель OSI .Например, ваш брандмауэр / маршрутизатор / сервер может прервать тайм-аут неактивного входа в соединение через 10 минут, затем ваше соединение прикладного уровня должно сделать это через 10 минут - больше ждать не имеет смысла.протокол должен быть введен.Это может быть пинг (не совсем ICMP) или другая форма периодического бездействия.Когда одноранговый узел активен, он должен ответить и, таким образом, обновить отсчет времени ожидания на всех сетевых уровнях.После неудачной попытки, вызванной сигналом тайм-аута или сигналом уровня, прерванным соединение, вы можете предположить, что ваше соединение прикладного уровня также разорвано.

...