【问题标题】:Sticky session duration粘性会话持续时间
【发布时间】:2017-06-20 22:16:38
【问题描述】:

是否可以在 mod_cluster 中指定粘性会话持续时间?

我的意思是当一段时间没有活动时,卡住的会话被清除。

我们有一个可分发的应用程序,它在网络会话中保留对登录用户的引用。但是在登录时,Web 会话复制的速度不如登录请求之后的请求快。因此,如果对于这些请求,平衡器选择了一个尚未复制的节点,则用户将不会处于会话中并且会发生错误。

此功能的另一个用途是在服务器上使用缓存信息时。如果您不使用粘性会话,您将加载以在不同服务器中缓存多次相同的信息。但是,如果您使用粘性会话,您将在整个会话生命周期中都绑定到同一台服务器。

提前致谢

莱安德罗

【问题讨论】:

    标签: load-balancing mod-cluster sticky-session


    【解决方案1】:

    我找到了满足我们需求的解决方法。

    我在平衡器 (BALANCER_SESSION_ID_HEADER_NAME) 配置了不同的粘滞会话属性,并在客户端管理平衡器粘滞会话持续时间。

    第一次,我将counter + JSESSIONID 设置为BALANCER_SESSION_ID_HEADER_NAME。每次使用STICKY_SESSION_TIMEOUT,我将++counter + JSESSIONID设置为BALANCER_SESSION_ID_HEADER_NAME

    客户端代码:

    if (USE_STICKY_SESSION_TIMEOUT && this.getjSessionId() != null) {
      if (this.getLastResponseTime() != 0
          && new Date().getTime() - this.getLastResponseTime() > STICKY_SESSION_TIMEOUT) {
        balancerSubsessionCounter++;
      }
    
      final String cookie = BALANCER_SESSION_ID_HEADER_NAME + "=" + balancerSubsessionCounter + "-"
          + this.getjSessionId();
      this.addCookie(httpPost, cookie);
    }
    
    //invoke service
    
    if (USE_STICKY_SESSION_TIMEOUT) {
      this.setLastResponseTime(new Date().getTime());
    }
    

    【讨论】:

      【解决方案2】:

      回答

      在 mod_cluster 中的会话粘性在一定时间内无法打开和关闭。一个是打开还是关闭。

      进一步的cmets

      IIUC,您实际上是在会话到期或会话失效之后。您可以在任何时候以编程方式决定使会话无效,或者您可以通过设置过期超时让它过期。

      您能否详细说明您将如何使用“会话粘性超时”?如果有意义的话,我们可以创建一个 JIRA 并实现一个新功能......

      【讨论】:

      • 谢谢 Michal,我不想让服务器会话失效,我希望平衡器不会永远保持会话粘性。平衡器什么时候清除会话服务器表?
      • @leaqui,永远不会清除这样的映射:Balancer 在请求标头(或 URL 的查询参数)中接收到带有 JSESSIONID yoloyoloyoloyolo.worker-1 的请求。如果它启用了粘性会话,它会将请求传递给 worker-1。工作人员的名称是 JSESSIONID 的一部分。 TL;DR:我们不会在平衡器上存储任何会话数据,也不会存储任何映射 - 所有信息都在 JSESSIONID 字符串本身中。
      • 谢谢@michal,这么简单。
      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 2018-09-28
      • 2014-05-22
      • 1970-01-01
      • 2018-01-24
      • 2017-09-09
      • 2016-06-20
      • 2013-10-17
      相关资源
      最近更新 更多