session一致性
什么是session
web-server可以自动为同一个浏览器的访问用户自动创建session,提供存储功能。一般把用户登录信息存到session中。
什么是session一致性问题
当后端只有一台web-server的时候,每次http请求,都能找到正确的session。问题是不能满足高可用,一台server挂了就完蛋了。冗余+故障转移,部署多台web-server,nginx路由到不同的web-server。每次http请求都路由,不保证路由到同一个server,就有了一致性问题。
解决session一致性的常用方案
一致性hash
最先想到的方案,根据客户端IP做hash,保证同一个IP落在一个web-server上。还可用根据业务字段做hash,例如userId、cityId,使用更灵活。但这样破坏了单一原则,让网关和业务粘连,如非必要不推荐使用。优点:节省缓存,可用水平扩展。缺点:部分服务重启,会丢失session,导致部分用户重新登录。如果hash水平扩展,rehash后session重新分布,会有一部分用户路由不到session
session同步
多web-server之间的session互相同步,这样每个web-server都包含全部的session信息。缺点:因为包含全部session,集群数量受内存限制,扩展受限。
客户端存储
登录信息保存到客户端,每次请求带着用户信息。服务端完全无状态化,方便扩展。优点:服务端不用存储。缺点:每次http请求携带用户信息,浪费流量;存在信息泄露风险;cookie存储信息不能太多。
后端集中存储
web-server链接一个统一的存储,保存session信息,推荐存到redis集群,方便后续扩展。优点:没有信息泄露风险;水平扩展不会丢数据;缺点:增加了一次网络请求,需要修改业务代码,查询redis。
以上是session一致性设计的详细内容。更多信息请关注PHP中文网其他相关文章!