Веб-служба с несколькими экземплярами с балансировкой нагрузки — сохранение данных запросов

#load #amazon-ec2 #cloud #load-balancing #instances

#загрузка #amazon-ec2 #облако #балансировка нагрузки #экземпляры

Вопрос:

Я постараюсь четко описать свой вопрос. Предположим, я запустил веб-службу Java REST на Amazon EC2. HTTP-запрос попадает в один из моих сервисов со строкой «testString». Я сохраняю его в памяти в некотором общем классе, допустим, я добавляю его в список (‘stringsList’) строк.

Мой вопрос: если у меня есть несколько экземпляров моего веб-сервиса, будет ли эта строка доступна в каждом из этих экземпляров?Если пользователь создаст HTTP-запрос, который вызывает «stringsList.getString(‘testString’)», он наверняка получит строку? Или он может пропустить это, потому что это доступно, но в другом экземпляре моего веб-сервиса?

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

Масштабируемый веб-сервис (от Heroku)

Я попытаюсь предоставить подробности, хотя я не так уверен:

  1. Если я запустил веб-службу через SSH к своему экземпляру EC2, и есть только один подобный этому, это не будет проблемой, верно?
  2. Если я сделаю то же самое, но для многих экземпляров и с помощью Amazon Elastic Load balancing?
  3. Если ответ на 2 заключается в том, что может быть ошибка, но я все еще хочу добиться этого, каков альтернативный способ?
  4. Может быть, не стоит делать это на Amazon EC2, а на другом сервисе? Если да, то какой?

    • Поместить это в базу данных — это не то, что я хочу, я хочу сохранить это только на несколько часов в памяти для того, что мне нужно.

Спасибо,
Liran

Ответ №1:

Memcache кажется естественным выбором для решения этой проблемы. Однако он доступен не только в Google App Engine. При желании вы также можете запустить свой собственный сервер Memcache на EC2.

Ответ №2:

В Amazon нет концепции «разделяемой памяти», и нет, эта строка не будет доступна во всех экземплярах. Это простая база данных, но вы говорите, что не хотите использовать DB.

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

Google App Engine мог бы подойти лучше. Он поддерживает Memcache во всех используемых вами экземплярах сервлета, и все экземпляры сервлета могут обращаться к одному и тому же memcache.