服务无状态化定义
- 冗余部署的多个模块(进程完全对等)
- 请求提交到冗余部署的任一模块,处理结果完全一样
- 模块不存储业务的上下文信息
- 仅根据每次请求携带数据进行相应的业务逻辑处理
服务无状态化目的
- 快速扩容服务
- 弹性缩容服务
服务无状态化案例
- 用户Session数据
- 登录方法
- 用户名+密码
- 手机号+验证码
- 登录成功
- 生成用户凭证(session)
- AES(UID+Timestamp+校验码)
- 登录方法
用户的session存放在哪一层?
网关层
用户的sesson怎么存放
[✔]外部存储(统一的分布式存储/客户端存储,每次请求携带数据)
[X]内存中。(即使是id通过hash,固定到一台,但是还是有可能因为机器挂了,导致出现问题)
redis集群扩容方案
由于用户量的增加,原来一个128个节点的机器需要扩容一倍。
- 在业务低峰期修改配置,重启应用。
- 那么一部分用户的session丢失,这个时候需要客户端的静默登录功能
- 静默登录功能:在客户端存储用户的账号密码,如果用户没有登录则重试用该账号密码登录一次。
- 使用codis作为redis的集群方案
FAQ
为啥不使用redis-cluster?
使用mget对多个key查询时,如果多个key在不同的节点,需要客户端多次请求,不太支持。
为啥不使用一致性hash?
一致性hash中,如果A节点网络瞬断,那么会访问顺时针的B节点,那么当A节点恢复时,session不是最新的。可以解决,但是一些强数据一致性要求的不太支持。