为什么我们有时需要在数据库中存储会话?

时间:2010-07-02 01:21:24

标签: http session tcp

我被告知在数据库中存储会话的一个常见原因是使其成为跨服务器。但是,在关闭浏览器之前,TCP连接是否持续存在?为什么下一个请求可能会切换到不同的服务器?

3 个答案:

答案 0 :(得分:3)

  

但是,在关闭浏览器之前,TCP连接是否持续存在?为什么下一个请求可能会切换到不同的服务器?

一旦网页加载,并且检索了所有图像,css文件和其他资产,TCP连接将很快关闭(例如,在Apache 2.2中after 5 seconds by default)。当用户单击其他内部链接时,将打开一个新的TCP连接。这可能最终会出现在多服务器负载平衡场景中的另一台服务器上。

答案 1 :(得分:1)

您将会话存储在数据库中,以便在对应用程序进行负载平衡时,负载均衡器可以将您的请求转发到服务器场中的任何服务器,并且仍然可以正确访问会话数据。

对网页的单个请求将转到单个服务器。下次用户发出请求时,会创建一个新的TCP连接,并将其发送到服务器场中的其他服务器。

答案 2 :(得分:0)

浏览器中的页面加载通常是无状态的(即,一旦页面完全加载,它们就不会存储状态。)

这意味着您的下一页加载(可能就像从购物目录页面到购物车页面一样简单)是一个单独的HTTP“事务”。

事实上,一个页面的文本及其12个图像(和400个色情广告)可能各自进入一个完全独立的服务器(即使它们使用相同的基本URL),因为它们可能在不同的TCP会话上运行

您不希望序列化所有流量,以便可以重复使用单个TCP会话,在单独的会话中并行执行这些流程通常会更快。

所以它可能最终会出现在完全不同的服务器上,是的。在这种情况下,您希望状态存储在某种共享资源中(如数据库)。

还有其他方法可以解决问题(总是存在),例如基于IP的亲和力,来自同一IP地址的流量将更喜欢相同的服务器,但面对所有可爱的负载平衡架构,这种苍蝇: - )