你有没有想过在程序的世界里,状态是怎么样被定义和描述的?
在这篇文章中你将了解到服务状态的定义,有状态和无状态的转化和应用实践场景。
德国足球-波多尔斯基如何理解状态
我们简明扼要,为状态赋个定义
状态指服务的运行结果,以及服务相互依赖产生的上下文。
提到状态,都会想到 HTTP 协议,HTTP 协议特点之一是无状态。
HTTP 中的无状态理解为单次 HTTP 请求响应 可以独立完成,每次请求不需要与上次请求有太多的关联和牵扯。
无状态的应用实践
在应用程序开发中,最基本的关于状态的应用实践就是 【用户信息】的保存和维护。
我们要理解:任何的应用程序都是要处理业务的。
我们以用户状态的流转为例来说明。
谁在处理业务,当然是系统的用户,所以用户在处理业务过程中的状态是需要被完整的,延续的保存。例如多页面跳转,企业内部多系统切换过程。
从系统层面来说,需要类似 SSO 或者通行证 Passport 这样的系统维护用户的状态,从技术概念来讲,需要 Cookie Session 和 Token 来记录完成。
状态的底层逻辑是数据存储
状态的底层逻辑是数据存储,应用程序的底层逻辑是业务逻辑。 从这个角度来说 无状态就是实现业务逻辑和数据存储的分离。
因此 服务无状态的实现要依赖于第三方的数据存储。
数据存储主要涉及到关系型 数据库,Redis,Zookeepker,文件存储,消息队列 等第三方中间件。
而编程的本质是实现控制和逻辑分离和接耦,无状态是实现数据和程序的分离,这两个一起理解,有没有异曲同工之妙?参看我之前关于关注点分离的文章
服务无状态的优势
当请求压力来临的时候,应用服务器可以不顾虑数据存储的情况下,在程序维度轻松实现水平扩展。
说白话就是说加机器可以扛流量
有状态的应用实践
上文提出状态的底层逻辑是数据存储,那么有状态的应用的底层逻辑 就是数据存储和服务工程粘连耦合。
单体应用,和传统的单个项目发布部署都是采用的这么模式。有几个特点,你不妨对应一下,是否存在。
-
系统中有个导出文件功能,文件会存储到项目工程的指定目录下,每次读取都从这里下载。
-
多个服务共同访问服务器上某个文件,实现权限的控制和记录。
-
访问日志按用户编号存储,只在应用程序指定目录下保存一份。
因为服务和文件都在同样的节点下,在访问和处理时,不会涉及到网络开销。
而这些服务需要扩展和调整时,对应的文件就会成为累赘和负担。
拓展
业界很流行的微服务架构中,实现微服务有四大步骤,其中有一点就是服务的无状态。
微服务四步法从架构设计层面,可以把系统分为有状态部分和无状态部分
服务是无状态化的,而业务必定是有状态的,所以一个应用系统必定可以分为有状态部分和无状态部分。 这也是一种架构切割方案。
之所以是无状态化的,是因为有状态部分被转移来,这就要靠中间件了。
合适的就是最好的
服务的无状态演化升级是实现分布式架构和微服务的充分不必要条件。
现实开发中,并不是所有的公司都能撑得起服务的完全无状态,然而这并不影响我们趋向于无状态化的设计我们的系统。
指导思想不会变,服务无状态,业务有状态。
还是那句话合适的就是最好的。
希望这篇文章可以在状态的认知上,帮助到你,欢迎留言评论。
图南日晟
网友评论