我想知道粘性会话和非粘性会话之间的区别。我从网上读到的是:
黏糊糊的:只有一个会话对象。
粘贴式会话:每个服务器节点的会话对象
当您的网站仅由一个web服务器提供服务时,对于每个客户端-服务器对,都会创建一个会话对象,并保留在web服务器的内存中。所有来自客户端的请求都发送到这个web服务器并更新这个会话对象。如果在交互期间需要将某些数据存储在会话对象中,则将其存储在此会话对象中,并在会话存在期间一直保存在那里。
然而,如果你的网站是由位于负载均衡器后面的多个web服务器提供服务的,负载均衡器决定每个请求应该去哪个实际的(物理的)web服务器。例如,如果负载均衡器后面有3个web服务器A、B和C,则可能由服务器A提供www.mywebsite.com,由服务器B提供www.mywebsite.com,由服务器C提供www.mywebsite.com/。
现在,如果请求是从3个不同的服务器(物理上)提供的,每个服务器都为您创建了一个会话对象,因为这些会话对象位于三个独立的盒子上,其中一个无法直接知道另一个的会话对象中有什么。为了在这些服务器会话之间进行同步,您可能必须将会话数据写入/读取到一个对所有人都通用的层——比如DB。现在,对于这个用例,在db中读写数据可能不是一个好主意。现在,这里是粘性会话的作用。
如果负载均衡器被指示使用粘滞会话,那么您的所有交互都将发生在同一台物理服务器上,即使存在其他服务器。因此,在与该网站的整个交互过程中,会话对象将是相同的。
总之,在粘性会话的情况下,所有的请求都将被定向到同一个物理web服务器,而在非粘性负载均衡器的情况下,可以选择任何web服务器来服务您的请求。
作为一个例子,你可以在这里读到亚马逊的弹性负载均衡器和粘性会话:http://aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html
我在这里做了一个更详细的回答: https://stackoverflow.com/a/11045462/592477 < / p >
或者你可以在这里读==>
当您使用负载平衡时,这意味着您有几个tomcat实例,您需要划分负载。
假设用户发送了一个请求来获取它的配置文件,在我们的web应用程序实例的内存中不会有任何东西。我们在发送响应之前从DB nit中获得用户配置文件,我们将数据保存在内存中,比如说Instance3。但是来自同一用户的下一个请求可以发送到任何实例。
当请求第一次到达Instance3时,它将创建一个具有会话id的会话。当响应被发送到客户端时,将向客户端提供一个cookie。所以下次这个客户端发出请求时,这个cookie将被附加到请求上,负载均衡器将查看这个cookie,负载均衡器将知道该请求必须转发到Instance3。这是sticky session解决方案。它的缺点是如果Instance3崩溃了怎么办?负载均衡器将请求路由到其他实例,但它们没有缓存。存储在Instance3中的所有用户都有很高的延迟。这将影响系统的reliability。
sticky session
reliability
如果将会话存储在所有实例中,现在就会出现内存问题。假设一个实例可以存储100个用户会话,而您有3个实例,那么您将能够存储300个会话。但是如果每个实例存储每个会话,那么在所有3个实例中只能存储100个会话。因此这将影响应用程序的scalability。
scalability
sticky和non-sticky会话是stateful replication的组件。如果你想要higher scalability,你没有在你的web应用实例上缓存任何东西,你的web实例会在每个请求时击中DB,但这会导致high latency。
sticky
non-sticky
stateful replication
higher scalability
high latency
更好的方法是无状态复制,即不在应用程序实例上存储任何东西,而是使用服务器端缓存(memcached/redis)。