2016-03-01 4 views
2

Я всегда использовал область session в своем приложении cfml, чтобы делать что-то вроде хранения текущего зарегистрированного объекта user. Здорово!как управлять состоянием cfcs в кластерной среде

user.isLoggedIn(), user.hasPremiumAccess(), user.hasRole('admin')

В попытке перенести мое приложение к кластерному (облако) среды, я понимаю, что, опираясь на session объем меньше, чем идеал, поскольку каждый экземпляр запущенного приложения имеет свой собственный сервер Память. Я знаю, что могу использовать «липкие сеансы», но я бы предпочел, чтобы это не ограничивало бы что-то вроде Amazon Elastic Beanstalk от свободно вращающихся вверх и вниз экземпляров приложения (основанных на нагрузке).

Я также знаю, что могу использовать область client для хранения простых значений в кластерном режиме, но как насчет сложных данных, таких как объект пользователя, который я описал? Как бы вы могли сохранить пользовательский объект или какой другой подход использовать?

Я могу внести изменения в приложение по мере необходимости.

** EDIT **, чтобы быть ясным, это не значит, что я НЕ МОЖЕТ использовать липкие сессии, я не хочу использовать липкие сессии (или репликации сеанса). Причина в том, что я могу использовать все преимущества масштабируемости, не полагаясь на память сервера/экземпляра для управления состоянием сеанса. Такой подход позволяет службе, такой как Elastic Beanstalk, свободно создавать и разрывать экземпляры приложений-приложений, не затрагивая пользователя вообще. Использование липких сеансов не позволяет этого.

некоторые возможные решения я рассмотрены, включают:

  1. Сериализация/десериализации «состояние» пользователь объекта пользователя для сохранения в клиента области действия и «повторной инициализации» пользователя на каждой странице загрузки
  2. Сериализация/десериализации «состояние» пользователь объекта пользователя, чтобы хранить в NoSQL БД и «переинициализация» пользователя при каждой загрузке страницы
+0

Если вы пытаетесь используйте ColdFusion на эластичном бобовом стебле, затем прочитайте эту ошибку - [AWS Elastic Beanstalk отклоняет WARFUN WARNING] (https://bugbase.adobe.com/index.cfm?event=bug&id=3365388) и связанную с ним почту здесь - http: // stackoverflow .com/q/12217424/1636917 –

+0

Интересно. Я пытаюсь запустить контейнер-докер в производстве (да, на Elastic Beanstalk), поэтому, если все обещания верны, пока демон docker работает на экземпляре EC2 (что он делает), приложение lucee, находящееся внутри докера контейнер также должен работать. Определенно работая через некоторые препятствия, но пальцы скрещены. –

+0

Lucee (Railo) не имеет проблемы с этой ошибкой, это относится только к Adobe CF, я думаю. –

ответ

4

Если вы не/не можете использовать " липких сессий ", то другой вариант заключается в реализации репликации сеанса. Это буквально копирует сеанс, хранящийся в памяти, каждому узлу кластера. И, да, на это накладные расходы.

Из документов:

Для осуществления сеанса восстановления после сбоя для экземпляров сервера в кластере, включить репликацию сеанса для каждого экземпляра сервера. Репликация сеанса координирует информацию о сеансе в реальном времени среди экземпляров сервера в кластере. Включение репликации сеанса позволяет Tomcat автоматически маршрутизировать запрос на работающий сервер, если текущий сервер недоступен.

Примечание: Когда кластер использует репликацию сеанса, данные сеанса копируются на другие серверы в кластере при каждом изменении. Это может ухудшить производительность, если вы храните значительный объем информации в области сеанса. Если вы планируете хранить значительный объем информации в области сеанса, подумайте о сохранении этой информации в клиентских переменных, сохраненных в базе данных.

С - Enabling clustering for load balancing and failover

Еще предостережение, что упоминается далее вниз этой страницы:

Если вы используете репликацию сеанса, перейдите на страницу Переменные памяти и включить J2EE сессий. Включить сеансы J2EE для всех экземпляров сервера в кластере. Если сеансы J2EE не включены в администраторе ColdFusion, репликация сеанса не работает должным образом. Сериализация CFC позволяет использовать репликацию сеанса J2EE в кластере и иметь доступ к CFC в данных сеанса во всех экземплярах кластера. Репликация сеанса также гарантирует, что переменные области сеанса реплицируются по всему кластеру. Однако репликация сеанса не поддерживает репликацию массивов в области CFC или переменных Session scope. Вы также можете сохранять и получать доступ к данным в CFC в случае переключения сеанса. Структуры ColdFusion, хранящиеся внутри области сеанса, доступны в области сеанса даже после перехода на другой ресурс. Например, если вы используете несколько экземпляров ColdFusion для балансировки нагрузки на сервер, вы можете хранить полезные данные, в том числе CFC, внутри сеанса, чтобы вы могли получать доступ к данным на всех страницах, которые обслуживаются в этом сеансе.

А также проверить этот ответ на тот же вопрос некоторое время назад (обратите внимание, что там была ошибка в более ранних версиях ColdFusion 10, которые не позволяют репликации сеанса работы) - https://serverfault.com/a/602373/135433

+0

Спасибо, что ответ Мигель! Я предпочел бы сделать вещи проще, а не сложнее, но, допустим, я готов изменить свое приложение, чтобы сделать его безстоящим. Каков наилучший способ хранения сложных объектов в среде без гражданства? Сериализация и десериализация состояния cfc каким-то образом и сохранение этого в db как json? «Репопуляция» этого пользователя по каждому запросу? Что-то другое? –

+0

Обычно я использую липкие сеансы в наших сбалансированных нагрузках средах (чтобы все было просто). Поэтому я не уверен, что смогу оказать вам большую помощь. Но моя первоначальная мысль заключается в том, что если ваше приложение действительно без гражданства, то почему вам нужно _share_ что-нибудь между ними? –

+0

Спасибо Мигель. Я могу просто пойти с липкими сеансами какое-то время, но в конце дня то, что нужно сохранить, - это данные сеанса, только для того, чтобы приложение «без гражданства» было сохранено таким образом, чтобы оно не было в зависимости от серверной памяти сервера-экземпляра, на котором он запущен. Здесь я часто видел, как часто используется клиентская область ... проблема заключается в том, что клиент не может хранить сложные данные без какого-либо хакерства. Просто ищу идеи на самом деле. –

 Смежные вопросы

  • Нет связанных вопросов^_^