0

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

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

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

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

提前致谢

莱安德罗

4

2 回答 2

2

回答

在 mod_cluster On 和 Off 中切换会话粘性在一定时间内是不可能的。一个要么打开,要么关闭。

进一步的评论

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

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

于 2017-02-07T12:40:47.823 回答
0

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

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

第一次,我设置counter + JSESSIONIDBALANCER_SESSION_ID_HEADER_NAME. 每次STICKY_SESSION_TIMEOUT花费时,我都设置++counter + JSESSIONIDBALANCER_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());
}
于 2017-02-24T19:30:23.243 回答