什么是无状态化设计?
服务的无状态化就是冗余部署的多个服务模块(进程),使其完全对等。也就是部署多个相同服务,请求到任一服务的处理结果是一样的。这些模块不存储业务的上下文信息,比如session、登录、业务上下文相关的信息。只会根据每次请求携带的数据进行相应的业务处理。
实质这些业务相关的信息是会存放在统一的一个地方,比如缓存、es等等。
目的
1.快速扩容
2.弹性扩容
具体案例实践
- 用户Session数据
登录的基本信息,登录后的基本信息:用户凭证,AES、JWT进行加密等。
由于业务量大,需要部署多台服务器构成应用集群,这时候请求一般经过DNS,进入网关层,通过负载均衡算法,分配到不同的服务上,业务的上下文数据在不同的服务器上,是无法同步的。因此我们做无状态化设计,考虑的就是用户的session数据如何存放。
用户session数据存放:
1. 网关层
2. redis集群
3. 外部存储
分析
直接存放在网关层
直接存放在网关层的话,就是类似一个单点登录的,这时候网关层是有状态的。单点,不高可用,有状态,不太好。
image
优化:
做集群,同步数据,全量。
特点:
1.保证高可用。
2.有状态化
image这时候还是有状态,如果其中一台机器挂了,还未同步到另外两台,信息还是会丢失。同时,还要解决复杂的全量同步数据问题。
用户Session数据存储在客户端
满足:
- 高可用
- 网关层可以无状态化
- Session可能会丢失
存储在外部(redis)
用户Session数据外部存储
特点:
- 网关无状态化
- Session数据可以保持高可用,比如redis,使用其高可用的策略
类似使用redis做分片以及集群。
网友评论