2013-12-22 3 views
0

У нас есть устаревший java webapp, который мы хотели бы перенести на Heroku. Он использует сессионную липкость, которая, к сожалению, запрещена на Heroku - так что мы задаемся вопросом, что рекомендуемая альтернатива Heroku?Рекомендация Heroku заменить сессионную липкость?

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

На Heroku нам нужно другое решение, и все мои идеи до сих пор - кажется немного ugtly ...

(1) Я рассматривал сеанс репликации, но это плохо сказывается на производительности, особенно при большом количестве динамометрические стенды

(2) Я рассматривал хранение ShoppingCart во внешнем хранилище данных (например, базу данных). Но как я узнаю, какая тележка принадлежит тому пользователю? Отзыв пользователя не вошел в систему, поэтому я не могу найти Корзину по имени пользователя. Мне нужно назначить какое-то временное имя, которое на самом деле имитирует поведение сеанса: отправьте его в браузер в виде куки-файла (чтобы он идентифицировал дальнейшие запросы от одного и того же клиента), не забудьте очистить его после некоторого простоя.

Я чувствую, что мне не хватает намерения дизайна Heroku, потому что мой код становится более уродливым, а не чище ... есть ли лучшие решения, пожалуйста? Спасибо

ответ

0

Вам необходимо использовать функцию --session-storewebapp-runner. См. https://github.com/jsimone/webapp-runner#store-your-sessions-in-memcache. Вы можете получить экземпляр memcached, прикрепленный к вашему приложению, через несколько надстроек Heroku. Redis также поддерживается как хранилище сеансов.

Если вы используете .war-развертывание и не имеете Procfile, Heroku по-прежнему использует webapp-runner под обложками и позволяет вам установить хранилище сеансов через WEBAPP_RUNNER_OPTS. См. https://devcenter.heroku.com/articles/war-deployment#advanced-options.

Вы не сможете выполнять «традиционную» репликацию, потому что 1) где приложение работает динамично и непредсказуемо, и 2) диноды не смогут прослушивать ничего, кроме HTTP-портов.

Надеюсь, что это поможет.

+0

Это помогло много - спасибо :) –

+0

Кроме того, будьте в курсе стандартного сеанса gotcha - все ваши объекты в HttpSession должны быть сериализуемыми. Это также вступает в игру, если вам понадобится масштабирование до нескольких динозавров: ваш пользователь будет отскакивать между ними (нет близости сеанса в Heroku). Вы можете эмулировать несколько динамиков локально с помощью Foreman (установленного с поясом инструмента), Procfile и локального «балансировщика нагрузки» - Apache или Nginx относительно легко настраиваются в этом качестве. – bimsapi

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