yuezk
2023-01-20 11:08:59 +08:00
先说一下什么是有状态,以用记登录场景为例,通常情况下,当用户登录成功之后,我们会把用户的信息保存在 HTTP session 中。这里的用户信息就是状态,HTTP session 实际上就是一个全局变量。当服务遇到问题重启的时候,变量会被销毁,这些状态就会丢失,用户的登录态就会丢,这显然是有问题的。另外,如果是多个服务实例,当用户登录到一个服务器后就没有办法负载均衡到另外的服务器,因为在其他的服务器上的 HTTP session 里面是没有用户信息的。
所以,我们需要无状态的服务,用户做完登录后,把 session 信息保存在外部,比如 redis 和数据库,这样,当服务器重启的时候,我们就可以把用户路由到其他的服务器,用户的登录态也不会丢。
在 K8s 的世界中,服务的重启或者删除重建是很常见的操作,所以要求服务无状态,便于扩展和恢复。
无状态不光在服务领域,我们平时写类的时候,也会有无状态的类这一说。