有状态服务和无状态服务

Posted 杨友山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有状态服务和无状态服务相关的知识,希望对你有一定的参考价值。

概念
服务一般分为有状态服务(Stateful Service)和无状态服务(Stateless Service)。它们的区别是,当请求发起后,服务在服务端运行时是否需要关联上下文。
有状态服务,服务端需要保存请求的信息,并且其它请求还可以使用已保存的信息。
无状态服务,服务端处理逻辑中所需要的数据,全部来此本次请求中带的信息。虽然服务端也保存了一些信息,但是这些信息要么与请求无关,要么所有请求都可以公用。

区别
无状态服务可以有一个或多个实例;有状态服务只有一个实例。
请求和请求间没有强关联关系,所以无状态服务实现扩展比较方便,请求可以发送至任意服务上去,而不用考虑请求切换问题。
有状态服务可以实现事务,事务简单来说就是多件事情组成一个集合,集合中没见事情要全部正确完成了,这个集合才算完成。如果集合中的事情有一个没有完成,即使其他事情完成了,也得将已完成的事情的相关数据恢复到原来的状态,就是回滚。
比如说,同一个用户的业务逻辑,多次请求的数据可以存放在session中,当另外的几个请求处理完成后,从session中取出数据完成最终的处理。
实现事务,session和cookie都可以,一般session可看作是有状态的,cookie是无状态的。
那么有状态服务方便实现事务,无状态服务其实也能实现事务。

无状态服务实现事务有这几种办法:
1、用session
无状态服务虽然每次请求没有关联,但是对于同一个用户session却是公用的,所以可以将几次请求的数据放在session中,完成数据的传递。
2、隐藏表单
当第一个请求传递了数据到服务端后,可以将第一个请求的数据作为另一个请求中某个表单的隐藏数据,当另一个请求提交时将这个隐藏数据取出来合并到一起提交。
3、用cookie
多次请求的数据保存在cookie中

如何使用
在不考虑水平扩展,并且有事务需要的场景中,使用有状态服务。
需要伸缩扩展,可以用无状态服务,无状态服务实现事务,可以使用例如session,隐藏表单等手段完成事务的实现。

以上是关于有状态服务和无状态服务的主要内容,如果未能解决你的问题,请参考以下文章

有状态服务和无状态服务

图解分布式的两种单点问题(有状态服务和无状态服务)

图解分布式的两种单点问题(有状态服务和无状态服务)

Spring Security 和无状态的 Restful 服务

同一应用程序中的 Spring 和 Jersey State 完整和无状态方法

创建FTP服务器和无密码登陆