###

alias hbin me

Deprecated Sticky Session

由于 HTTP 的无状态特性,服务器会为每一个用户生成一个 Session,并且给定一个 ID,保存在内存中。当用户再次访问的时候,就通过 Cookie 里的 Session ID 查找出对应的 Session。这在只有一个服务器的时候一切安好,但是当有多个服务器,需要做负载均衡的时候,就会遇到问题,如何保证同一个用户多次访问时依然能拿到他的 Session?

因为负载均衡默认采用 round-robin 方式分配请求,这样同一个用户多次请求就可能分配到不同的机器上。为了解决这个问题,引入了 Sticky Session。它通过 HTTP Header 或者 IP 地址,将用户与某一台服务器 “绑定” 起来,这样保证该用户的请求都会被同一个服务器处理。

很明显,这种方式有很多问题。

  1. 如果这台机器挂了,那存在上面的 Session 也没有了
  2. 负载均衡变得 “不均衡” 了,如果某一服务器上的用户突然大量的请求,会拖累这台服务器的所有用户
  3. 新增的机器无法很快的分担负载
  4. 由于网络问题,用户的 IP 地址会不停变化,Sticky 失效
  5. 不支持 HTTPS!由于 HTTPS 会加密请求的内容,Sticky 彻底作废!

基于以上原因,Sticky Session 并不能解决问题(国内还有不少文章还在介绍这个东西)

解决方法我认为有两个:

  1. 把 Session 加密后存储在 Cookie 里,这种方式最简单,也是无成本的,不过如果要在 Session 中存比较大的内容的时候就不适用了,这也是 Rails 所采用的方法。
  2. 把 Session 存在集中存储服务上,比如:数据库,Redis。这种方式灵活度高,方便管理,不过要处理好 Replication 的问题。

[referrences]