Продолжительность липкой сессии

можно ли указать длительность липкой сессии в mod_cluster?

Я имею в виду, что зависший сеанс очищается, если в течение определенного периода времени нет активности.

У нас есть распространяемое приложение, которое хранит ссылку на зарегистрированного пользователя в веб-сеансе. Но во время входа в систему репликация веб-сеанса не настолько быстра, как запросы, следующие за запросом входа в систему. Итак, если для этих запросов балансировщик выберет узел, который еще не был реплицирован, пользователь не будет в сеансе и произойдет ошибка.

Другой вариант использования этой функции - использование кэшированной информации на сервере. Если вы не используете липкий сеанс, вы несколько раз загружаете для кеширования одну и ту же информацию на разных серверах. Но если вы используете липкий сеанс, вы будете привязаны к одному и тому же серверу на всю жизнь сеанса.

заранее спасибо

Леандро


person leaqui    schedule 03.02.2017    source источник


Ответы (2)


Отвечать

Невозможно включить или выключить липкость сеанса в mod_cluster в течение определенного времени. У одного он либо включен, либо выключен.

Дальнейшие комментарии

IIUC, вы фактически находитесь после истечения срока действия сеанса или его недействительности. Вы можете программно принять решение об отмене сеанса в любой момент или позволить ему истечь, установив таймаут истечения срока.

Не могли бы вы подробнее рассказать, как бы вы использовали «таймаут закрепления сеанса»? Мы могли бы создать JIRA и реализовать новую функцию, если это имеет смысл ...

person Michal Karm Babacek    schedule 07.02.2017
comment
Спасибо, Михал, я не хочу аннулировать сеанс сервера, я хочу, чтобы балансировщик не сохранял привязку сеанса навсегда. Когда балансировщик очищает таблицу сеансового сервера? - person leaqui; 07.02.2017
comment
@leaqui, такое сопоставление не подлежит очистке: Balancer получает запрос с JSESSIONID yoloyoloyoloyolo.worker-1 в заголовке запроса (или в параметре запроса URL-адреса). Если у него включены липкие сеансы, он передает запрос worker-1. Имя воркера является частью JSESSIONID. TL; DR: мы не храним никаких данных сеанса на балансировщике, и мы не храним никакого сопоставления - вся информация находится в самой строке JSESSIONID. - person Michal Karm Babacek; 14.02.2017
comment
Спасибо @michal, так просто. - person leaqui; 24.02.2017

Я нашел обходной путь для наших нужд.

Я настраиваю другой атрибут 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());
}
person leaqui    schedule 24.02.2017