Coldfusion 2018 кластеризация и репликация сеанса не работает

Настроив пару новых серверов Coldfusion 2018, вы впервые будете использовать кластеризацию и столкнулись с некоторыми проблемами.

У меня проблемы с репликацией сеанса. По сути, переменные сеанса, похоже, реплицируются между узлами в кластере, но уничтожаются через некоторое время наугад.

Немного информации о настройке:

  • 2 веб-сервера (Windows Server 2012) за балансировщиками нагрузки
  • На каждом веб-сервере находится кластер Coldfusion, состоящий из 2 локальных экземпляров (до сих пор неясно, полезно ли это или нет - задаст отдельный вопрос) и 2 удаленных экземпляра (удаленные ссылаются на локальные экземпляры каждого противоположного сервера)
  • Для простоты, в настоящее время просто тестируем на одном сервере с локальными экземплярами Coldfusion - оставляя удаленные из уравнения, пока я не смогу обеспечить надежную локальную работу
  • Использование переменных сеанса J2EE
  • Тайм-аут сеанса Coldfusion установлен на 2 часа
  • В каждом экземпляре Coldfusion для channelSendOptions установлено значение "6".

Вот что я сделал / испытал:

  • У нас есть веб-приложение, которое требует входа в систему и сохраняет информацию о пользователе в сеансе после входа в систему.
  • Я сделал небольшую модификацию веб-приложения, чтобы показать, какой экземпляр кластера обслуживает мой текущий запрос.
  • После настройки кластера я запустил веб-приложение и вошел в систему, отметив экземпляр, который отображал страницу входа.
  • После входа в систему меня сразу же вернули на экран входа в систему (приложение проверяет информацию о пользователе в сеансе и перенаправляет на страницу входа, если она не найдена).
  • Отладка показала, что я на самом деле входил в систему, но после перенаправления на новую страницу после входа информация о пользователе исчезла из сеанса.
  • Многократные попытки входа в систему подряд (одни и те же учетные данные, которые просто повторялись снова и снова) показали, что иногда вход в систему может происходить очень хорошо, и я попадаю в приложение. Однако если я обновлю страницу или перейду на другую страницу, сеанс будет потерян очень скоро, но случайно (через несколько обновлений страницы).
  • В попытке упростить задачу, чтобы попытаться выяснить, что происходит, я создал простой файл.cfm, который обходит все элементы входа и делает одно: добавляет простое строковое значение в сеанс, а затем выводит имя сеанса и имя экземпляра. ** Я запустил скрипт один раз, отметил, какой экземпляр используется, и в этом сеансе содержится мое значение. ** Затем я отредактировал скрипт, чтобы он больше не устанавливал значение сеанса. ** Затем я снова и снова нажимал "Обновить", чтобы подтвердить:
    1. Что запросы обслуживались обоими экземплярами в кластере
    2. Когда я переключался между экземплярами, значение сеанса было доступно все время.
  • Опять же, репликация будет работать, и в течение нескольких обновлений я мог видеть свою переменную сеанса доступной в каждом экземпляре... пока это не так. После случайного количества обновлений / секунд (скажем, от 2 до 10 обновлений) значение исчезнет.

Я затрудняюсь объяснить, почему это происходит. Мы рассмотрели возможность использования Redis в качестве хранилища сессий, чтобы посмотреть, помогло ли это, но, честно говоря, наша команда не имеет опыта работы с ним, не очень удобно работать в Windows, и мы действительно не хотим больше движущихся частей в нашей инфраструктуре, если мы можем помочь Это.

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

Спасибо

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

Ниже приведен простой тестовый скрипт. Первая строка не комментируется при первом запуске для создания переменной сеанса и комментируется для каждого последующего запуска.

<!--- <cfset Session.svar="cake!"> --->

<cfdump var="#Session#" />

<cfscript>
hostaddress = createObject("java", "java.net.InetAddress").localhost.getHostAddress();
</cfscript>

<cfoutput>
<h3>
Instance: #createobject("component","CFIDE.adminapi.runtime").getinstancename()#
</h3>
</cfoutput>

Обновить 1

Обновить 2

Обновить 3

Обновить 4

Обновить 6

Обновить 7

Обновить 8

Обновить 11

Обновить 13

0 ответов

Другие вопросы по тегам