#load #amazon-ec2 #cloud #load-balancing #instances
#загрузка #amazon-ec2 #облако #балансировка нагрузки #экземпляры
Вопрос:
Я постараюсь четко описать свой вопрос. Предположим, я запустил веб-службу Java REST на Amazon EC2. HTTP-запрос попадает в один из моих сервисов со строкой «testString». Я сохраняю его в памяти в некотором общем классе, допустим, я добавляю его в список (‘stringsList’) строк.
Мой вопрос: если у меня есть несколько экземпляров моего веб-сервиса, будет ли эта строка доступна в каждом из этих экземпляров?Если пользователь создаст HTTP-запрос, который вызывает «stringsList.getString(‘testString’)», он наверняка получит строку? Или он может пропустить это, потому что это доступно, но в другом экземпляре моего веб-сервиса?
Я хочу иметь возможность запускать свой веб-сервис как масштабируемый с балансировкой нагрузки и несколькими экземплярами, но при этом иметь возможность сохранять некоторую конкретную информацию о HTTP-запросах (возможно, именно поэтому остальные должны быть без состояния, следовательно, мой дизайн неправильный, если я хочу это сделать?). Веб-сервис, к которому я стремлюсь, выглядит примерно так:
Масштабируемый веб-сервис (от Heroku)
Я попытаюсь предоставить подробности, хотя я не так уверен:
- Если я запустил веб-службу через SSH к своему экземпляру EC2, и есть только один подобный этому, это не будет проблемой, верно?
- Если я сделаю то же самое, но для многих экземпляров и с помощью Amazon Elastic Load balancing?
- Если ответ на 2 заключается в том, что может быть ошибка, но я все еще хочу добиться этого, каков альтернативный способ?
-
Может быть, не стоит делать это на Amazon EC2, а на другом сервисе? Если да, то какой?
- Поместить это в базу данных — это не то, что я хочу, я хочу сохранить это только на несколько часов в памяти для того, что мне нужно.
Спасибо,
Liran
Ответ №1:
Memcache кажется естественным выбором для решения этой проблемы. Однако он доступен не только в Google App Engine. При желании вы также можете запустить свой собственный сервер Memcache на EC2.
Ответ №2:
В Amazon нет концепции «разделяемой памяти», и нет, эта строка не будет доступна во всех экземплярах. Это простая база данных, но вы говорите, что не хотите использовать DB.
Можно всегда направлять пользователя к тому же экземпляру, к которому он был впервые направлен, используя cookies в балансировщике нагрузки, но не похоже, что это решает вашу проблему, я предполагаю, что эта строка предназначена не только для пользователя, который ее устанавливает.
Google App Engine мог бы подойти лучше. Он поддерживает Memcache во всех используемых вами экземплярах сервлета, и все экземпляры сервлета могут обращаться к одному и тому же memcache.