Длительность липкой сессии
Можно ли указать длительность липкой сессии в mod_cluster?
Я имею в виду, что застрявший сеанс очищается, когда в течение определенного периода времени нет активности.
У нас есть распространяемое приложение, которое сохраняет ссылку на зарегистрированного пользователя в веб-сеансе. Но во время входа в систему репликация веб-сеанса не выполняется достаточно быстро, поскольку запросы следуют за запросом входа в систему. Таким образом, если для этих запросов балансировщик выберет узел, который еще не был реплицирован, пользователь не будет в сеансе и произойдет ошибка.
Другое использование этой функции может быть при использовании кэшированной информации на сервере. Если вы не используете липкий сеанс, вы бы загружали для кэширования несколько раз одну и ту же информацию на разных серверах. Но если вы используете липкую сессию, вы будете привязаны к одному и тому же серверу на протяжении всей жизни сессии.
заранее спасибо
Leandro
2 ответа
Ответ
Невозможно включить или выключить привязку сеанса в mod_cluster в течение определенного промежутка времени. Один либо есть, либо выключен.
Дальнейшие комментарии
IIUC, вы на самом деле после истечения срока действия сессии или аннулирования сессии. Вы можете программно принять решение о недействительности вашего сеанса в любой момент, или вы можете позволить ему истечь, установив тайм-аут истечения.
Не могли бы вы подробнее рассказать о том, как использовать "тайм-аут прилипания сеанса"? Мы могли бы создать JIRA и реализовать новую функцию, если это имеет смысл...
Я нашел обходной путь для наших нужд.
Я настраиваю другой атрибут stickysession на балансировщике (BALANCER_SESSION_ID_HEADER_NAME
) и управлять продолжительностью липкого сеанса балансировщика на стороне клиента.
Первый раз я установил counter + JSESSIONID
в BALANCER_SESSION_ID_HEADER_NAME
, Каждый раз STICKY_SESSION_TIMEOUT
потрачено, я поставил ++counter + JSESSIONID
в BALANCER_SESSION_ID_HEADER_NAME
,
Код клиента:
if (USE_STICKY_SESSION_TIMEOUT && this.getjSessionId() != null) {
if (this.getLastResponseTime() != 0
&& new Date().getTime() - this.getLastResponseTime() > STICKY_SESSION_TIMEOUT) {
balancerSubsessionCounter++;
}
final String cookie = BALANCER_SESSION_ID_HEADER_NAME + "=" + balancerSubsessionCounter + "-"
+ this.getjSessionId();
this.addCookie(httpPost, cookie);
}
//invoke service
if (USE_STICKY_SESSION_TIMEOUT) {
this.setLastResponseTime(new Date().getTime());
}