具有负载平衡的多实例Web服务 - 保存请求数据

时间:2011-05-01 16:49:38

标签: load amazon-ec2 cloud load-balancing instances

我会试着清楚地描述我的问题。 假设我在Amazon EC2上运行了一个Java REST Web服务。 HTTP请求通过字符串“testString”到达我的一个服务。我将它保存在一些通用类的内存中,假设我将它添加到字符串列表('stringsList')中。

我的问题是:如果我有多个我的网络服务实例,这个字符串是否会在每个实例上都可用? 如果用户将生成一个调用“stringsList.getString('testString')”的HTTP请求, 它会得到字符串肯定吗?或者它可以错过它,因为它可用,但在一个 我的网络服务的不同实例?

我希望能够将我的Web服务作为可扩展的Web服务运行,并且具有多个负载平衡功能 实例,但仍然能够保存一些特定的HTTP请求信息(也许这个 正是为什么REST应该是无状态的,因此如果我想这样做,我的设计是错误的 ? )。 我瞄准的网络服务是这样的:

Scalable web service (from Heroku)

我会尝试提供细节,虽然我不太确定:

  1. 如果我通过SSH将Web服务运行到我的EC2实例,并且只有一个像 这个,这不会是个问题,对吗?
  2. 如果我这样做,但对于很多实例,并通过Amazon Elastic负载平衡?
  3. 如果对2的回答是可能会有错过,但我仍然希望实现这一目标,那么替代方法是什么?
  4. 在Amazon EC2上执行此操作可能不是一个好主意,但在不同的服务上?如果是这样,哪一个?

    • 把它放在数据库中并不是我想要的,我想在内存中保存几个小时以备我所需。
  5. 谢谢,
    丽然

2 个答案:

答案 0 :(得分:1)

Memcache似乎是这个问题的自然选择。但它不仅适用于Google App Engine。如果您愿意,也可以在EC2上运行自己的Memcache服务器。

答案 1 :(得分:0)

亚马逊上没有“共享内存”概念,不,该字符串不会在所有实例上都可用。这是简单的数据库,但你说你不想使用数据库。

总是可以将用户引导到他们最初被指向使用负载均衡器上的cookie的同一个实例,但听起来这并不能解决您的问题,我猜这个字符串不只是为了用户设定它。

Google App Engine可能更适合。它支持您使用的servlet实例中的Memcache,并且所有servlet实例都可以访问相同的内存缓存。