实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。
这种方法提出的一个挑战是服务器是状态感知的——将用户状态存储在“会话”中。
这个问题的一种解决方案是“粘性会话”(也称为“会话亲和性”),其中每个用户都被分配到一个服务器,并且他/她的状态数据在整个会话期间专门包含在该服务器上。
“粘性会话”方法的优点和缺点是什么?你用过吗?如果用过,你满意吗?
实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。
这种方法提出的一个挑战是服务器是状态感知的——将用户状态存储在“会话”中。
这个问题的一种解决方案是“粘性会话”(也称为“会话亲和性”),其中每个用户都被分配到一个服务器,并且他/她的状态数据在整个会话期间专门包含在该服务器上。
“粘性会话”方法的优点和缺点是什么?你用过吗?如果用过,你满意吗?
优点:
缺点:
但是如果你必须使用服务器本地会话状态,粘性会话绝对是要走的路——即使你不使用服务器本地会话状态,粘性在缓存利用率方面也有好处(见上文)。您的负载平衡器应该能够查看 HTTP cookie(不仅是 IP 地址)来确定粘性,因为 IP 地址可以在单个会话期间更改(例如,将笔记本电脑停靠在有线和无线网络之间)。
更好的是,根本不要在 Web 服务器上使用会话状态!如果会话状态丢失非常痛苦(例如购物车),请将其存储在中央数据库中并定期清除旧会话。如果会话状态不重要(例如用户名/头像 URL),则将其粘贴到 cookie 中——只要确保您没有将太多数据放入 cookie 中。
由于上述原因,现代版本的 Rails 默认将会话变量存储在 cookie 中。其他 Web 框架可能具有“存储在 cookie”和/或“存储在 DB”选项。