使用Elastic Load Balancer的Amazon EC2上的Glassfish群集会话问题

时间:2013-09-30 07:12:46

标签: session amazon-ec2 glassfish cluster-computing servlet-filters

首先,此应用程序在非群集环境中运行良好。

我们遇到的问题是ELB在会话期间首先路由到群集中的一台服务器,然后路由到第二台服务器。第二台服务器找不到会话。例如

  1. iOS应用程序将登录调用传递给Glassfish 4服务器群集(我们使用oAuth / Facebook令牌,因此没有Glassish安全域)。
  2. Amazon Elastic Load Balancer(ELB)发送到服务器1。
  3. 会话已通过身份验证,用户已登录,会话cookie已传回应用。
  4. 应用程序立即发送另一个需要身份验证的请求(这是一个有效的会话)。
  5. ELB决定将请求发送到服务器2
  6. 在我们的身份验证servlet过滤器中,服务器2找不到具有通过cookie传入的id的会话
  7. servlet表示用户未经过身份验证,呼叫失败。
  8. 我们的代码非常典型地用于查找会话(如果没有会话立即返回失败):

    HttpSession session = req.getSession(false);
    //psuedocode
    if session == null then session not authenticated log and return
    else session authenticated, log and return
    

    如果第二个呼叫被路由到与登录相同的服务器,则第二个呼叫正常工作。每当一个呼叫(无论是第二个,第三个,第四个,无论什么)转到第二个服务器时,身份验证都会失败,因为它无法在第二个服务器上找到该会话。

    我正在寻找是否有人遇到过这样的事情,以及你是如何解决这个问题的。是否更好地在ELB上使用粘性会话,或者使用JK或AJP的Apache Web服务器是更好的选择?

1 个答案:

答案 0 :(得分:0)

我头脑中有两个潜在的问题:

  1. 您是否在web.xml中指定了<distributable/>
  2. 可能是多播问题。 EC2不支持多播,这是GlassFish默认使用的。查看讨论该主题的this stackoverflow thread,包括非多播群集。