粘性会话和会话复制

Ash*_*ish 26 session tomcat session-replication

我正在评估在tomcat中使用会话复制的粘性会话的情况.从我最初的评估开始,我认为如果我们启用会话复制,那么在一个tomcat节点中启动的会话将被复制到所有其他tomcat节点,因此我们不需要粘性会话来继续会话,并且任何节点都可以接收请求.

但似乎会话复制通常与粘性会话一起使用,否则只要请求转到其他节点,就需要更改会话ID.ref:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node

如果你必须启用粘性会话,任何人都可以解释会话复制的真正用途吗?因为当具有给定会话ID的请求始终到达同一节点时,您将不必要地在每个节点上复制会话.在节点崩溃的情况下它可能是有益的,但是这不会经常发生并且仅使用会话复制似乎是一种过度杀伤.

Nic*_*ico 74

正如Mindas之前解释的那样:

当您使用负载平衡时,它意味着您有多个tomcat实例,并且您需要划分负载.

  • 如果您正在使用没有粘性会话的会话复制:想象一下,您只有一个用户使用您的Web应用程序,并且您有3个tomcat实例.此用户向您的应用程序发送多个请求,然后负载均衡器将其中一些请求发送到第一个tomcat实例,并将其他一些请求发送到第二个实例,而另一个请求发送到第三个实例.
  • 如果您在没有复制的情况下使用粘性会话:想象一下,您只有一个用户使用您的Web应用程序,并且您有3个tomcat实例.此用户向您的应用程序发送多个请求,然后负载均衡器将第一个用户请求发送到三个tomcat实例之一,此用户在其会话期间发送的所有其他请求将被发送到同一个tomcat实例.在这些请求期间,如果您关闭或重新启动此tomcat实例(使用的tomcat实例),则loadbalancer会将剩余请求发送到另一个仍在运行的tomcat实例,但是因为您不使用会话复制,所以接收的实例tomcat其余请求没有用户会话的副本,然后对于此tomcat用户开始会话:用户松开会话并且与Web应用程序断开连接,尽管Web应用程序仍在运行.
  • 如果您正在使用粘性会话和会话复制:想象一下,您只有一个用户使用您的Web应用程序,并且您有3个tomcat实例.此用户向您的应用程序发送多个请求,然后负载均衡器将第一个用户请求发送到三个tomcat实例之一,此用户在其会话期间发送的所有其他请求将被发送到同一个tomcat实例.在这些请求期间,如果您关闭或重新启动此tomcat实例(使用的tomcat实例),loadbalancer会将剩余的请求发送到另一个仍在运行的tomcat实例,因为您使用会话复制,接收剩余请求的实例tomcat具有用户会话的副本然后用户继续他的会话:用户继续浏览您的Web应用程序而不断开连接,关闭tomcat实例不会影响用户导航.

  • 好吧,你谈到"节点崩溃",但你也可能想要更改两个节点,或删除两个节点,或者你想要更新你的web应用程序......并且这样做你不想停止用户会话,你希望他们不要看到你的介入.然后使用复制将允许您执行此操作. (5认同)

min*_*das 10

我认为唯一真正的好处是能够在没有太多思考的情况下关闭Tomcat实例.特别是当节点可以经常打开和关闭时,这适用于云世界(想想亚马逊AWS点实例).替代方案是购买一个支持节点排放的合适负载均衡器.但体面的负载平衡器价格昂贵,排水需要时间.

我能想到的另一个场景是(购物车的实施不佳),其中物品被保留在中HttpSession并且关闭将需要用户重新购买它们(这可能导致销售损失).

但在大多数情况下,你是对的 - 让粘性会话和会话复制都可以忽略不计.