天天看点

有状态服务和无状态服务

概念

服务一般分为有状态服务(Stateful Service)和无状态服务(Stateless Service)。它们的区别是,当请求发起后,服务在服务端运行时是否需要关联上下文。

有状态服务,服务端需要保存请求的信息,并且其它请求还可以使用已保存的信息。

无状态服务,服务端处理逻辑中所需要的数据,全部来此本次请求中带的信息。虽然服务端也保存了一些信息,但是这些信息要么与请求无关,要么所有请求都可以公用。

区别

无状态服务可以有一个或多个实例;有状态服务只有一个实例。

请求和请求间没有强关联关系,所以无状态服务实现扩展比较方便,请求可以发送至任意服务上去,而不用考虑请求切换问题。

有状态服务可以实现事务,事务简单来说就是多件事情组成一个集合,集合中没见事情要全部正确完成了,这个集合才算完成。如果集合中的事情有一个没有完成,即使其他事情完成了,也得将已完成的事情的相关数据恢复到原来的状态,就是回滚。

比如说,同一个用户的业务逻辑,多次请求的数据可以存放在session中,当另外的几个请求处理完成后,从session中取出数据完成最终的处理。

实现事务,session和cookie都可以,一般session可看作是有状态的,cookie是无状态的。

那么有状态服务方便实现事务,无状态服务其实也能实现事务。

无状态服务实现事务有这几种办法:

1、用session

无状态服务虽然每次请求没有关联,但是对于同一个用户session却是公用的,所以可以将几次请求的数据放在session中,完成数据的传递。

2、隐藏表单

当第一个请求传递了数据到服务端后,可以将第一个请求的数据作为另一个请求中某个表单的隐藏数据,当另一个请求提交时将这个隐藏数据取出来合并到一起提交。

3、用cookie

多次请求的数据保存在cookie中

如何使用

在不考虑水平扩展,并且有事务需要的场景中,使用有状态服务。

需要伸缩扩展,可以用无状态服务,无状态服务实现事务,可以使用例如session,隐藏表单等手段完成事务的实现。

继续阅读