精华内容
下载资源
问答
  • 有状态服务和无状态服务
    千次阅读
    2020-08-25 12:51:43

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

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

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

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

    更多相关内容
  • 无状态服务(stateless service)

    千次阅读 2020-12-17 16:17:19
    简介: 一、定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储...

    感觉文章不错,拿来的信息。涉及到图的地方已经没有了,凑合看吧,因为原文里的图片链接都失效了,防止原文链接再失效,直接贴到这里存档

    简介: 一、定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息 有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的 二、优劣 有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一

    一、定义

    无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说数据库),服务器本身不存储任何信息

    有状态服务(stateful service)则相反,它会在自身保存一些数据,先后的请求是有关联的

    二、优劣

    有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息

    有状态服务可以很容易地实现事务,所以也是有价值的。但是经常听到一种说法,即server要设计为无状态的,这主要是从可伸缩性来考虑的。如果server是无状态的,那么对于客户端来说,就可以将请求发送到任意一台server上,然后就可以通过负载均衡等手段,实现水平扩展。如果server是有状态的,那么就无法很容易地实现了,因为客户端需要始终把请求发到同一台server才行,所谓“session迁移”等方案,也就是为了解决这个问题

    三、session和cookie

    基于session和cookie都可以实现事务,可以认为,session是有状态的,而cookie是无状态的

    四、无状态实现事务的方法

    并不是一定要用有状态服务才能实现事务,本文提供另外的几种方案作为参考
    举一个多次提交的场景作为例子:用户需要提交很多数据,分为2个页面提交

    这里就涉及到2次http请求,第一次提交字段1、2、3,第二次提交字段4、5、6

    用session很容易实现这个需求,server只需要将第一次提交的数据,保存在session里,然后返回第2个表单作为相应;然后取出第一次提交的数据,和第二次提交的数据汇聚以后,一起存入数据库即可

    不用session同样也可以实现,server接收到第一次请求以后,将数据作为隐藏元素,放在第2个表单里返回;这样用户第2次提交的时候,就隐含地再次提交了第一次的数据;server将所有数据存入数据库
    用HTML5,则还可以进一步优化,client可以将第一次提交的数据,保存在sessionStorage里
    用cookie也是类似的道理,同样可以实现,但是不太好

    总的来说,3种替代方案(隐藏表单元素、sessionStorage、cookie)都避免了在server端暂存数据,从而实现了stateless service。本质上,这3种方案的请求里,都包含了所有必须的数据,符合本文一开始的定义

    五、将有状态服务转换成无状态服务

    根据本文一开始的定义,除了将所有信息都放在请求里之外,还有另外一种方法可以实现无状态服务,即将信息放在一个单独可共享的地方,独立于server存在
    比如,同样还是采取session的方式,在服务端保存数据,减少每次client请求传输的数据量(节省流量);但是将session集中存放,比如放在单独的session层里。这种情况下,server同样是无状态的,可以做水平扩展

    六、无状态类

    引申一下,JAVA里有一种类的设计,可以称为无状态类。这种类的特征是只有方法没有字段,在三层架构(展现层、逻辑层、持久层)里,逻辑层经常可以看到这种类
    我觉得无状态类和stateless server在思想上是一样的,这个类本身是没有状态的,所以当外部要调用它的方法时,需要在方法参数中传来所需的所有信息,不依赖该类自身的状态(字段值),在并发环境下,可以避免多线程带来的副作用

    七、总结

    有状态服务可以比较容易地实现事务,在不需要考虑水平扩展时,是比较好的选择
    无状态服务的优势在于可以很方便地水平伸缩,但是在实现事务时,需要做一些额外的动作
    可以通过剥离session等方法,将一个有状态服务,转换成无状态服务

    展开全文
  • Kubernetes 无状态服务和有状态服务

    千次阅读 2020-01-25 15:50:27
    无状态服务 是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。 多个实例可以共享相同的持久化数据。例如:nginx实例,tomcat实例等 相关的k8s资源有:...

    无状态服务

    1. 是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。
    2. 多个实例可以共享相同的持久化数据。例如:nginx实例,tomcat实例等
    3. 相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以。

    有状态服务

    1. 宠物和牛的类比,农场主的牛如果病了可以丢掉再重新买一头,如果宠物主的宠物病死了是没法找到一头一模一样的宠物的。
    2. 有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)每个实例都需要有自己独立的持久化存储,并且在k8s中是通过申明模板来进行定义。持久卷申明模板在创建pod之前创建,绑定到pod中,模板可以定义多个。
     volumeClaimTemplates:
      - metadata:
          name: zookeeper
        spec:
          selector:
            matchLabels:
              app: zookeeper
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 3Gi

    说明: 有状态的 pod是用来运行有状态应用的,所以其在数据卷上存储的数据非常重要,在 Statefulset缩容时删除这个声明将是灾难性的,特别是对于 Statefulset来说,缩容就像减少其 replicas 数值一样简单。基于这个原因,当你需要释放特定的持久卷时,需要手动删除对应的持久卷声明。

    相关的k8s资源为:statefulSet,由于是有状态的服务,所以每个pod都有特定的名称和网络标识。比如pod名是由statefulSet名+有序的数字组成(0、1、2..)

    在进行缩容操作的时候,可以明确知道会缩容哪一个pod,从数字最大的开始。并且Stat巳fulset 在有实例不健康的情况下是不允许做缩容操作的。StatefulSet 缩容任何时候只会操作 一个 pod 实例,所以有状态应用的缩容不会很迅速。举例来说, 一个分布式存储应用若同时下线多个节点 ,则可能导致其数据丢失 。 比如说一个数据项副本数设置为 2 的数据存储应用, 若 同时有两个节点下线,一份数据记录就会丢失,如果它正好保存在这两个节点上 。 若缩容是线性的 ,则分布式存储应用就有时间把丢失的副本复制到其他节点 ,保证数据不会丢失。

    展开全文
  • 有状态服务 & 无状态服务

    万次阅读 多人点赞 2018-10-26 16:38:42
    无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息) 有状态服务:与之相反,...

    一、定义:

    1. 无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息)

    2. 有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等

    二、如何选择:

    有状态服务常常用于实现事务(并不是唯一办法,下文有另外的方案)。举一个常见的例子,在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息 。

                有状态服务可以很容易地实现事务,所以也是有价值的。但是经常听到一种说法,即server要设计为无状态的,这主要是从可伸缩性来考虑的。如果server是无状态的,那么对于客户端来说,就可以将请求发送到任意一台server上,然后就可以通过负载均衡等手段,实现水平扩展。如果server是有状态的,那么就无法很容易地实现了,因为客户端需要始终把请求发到同一台server才行,所谓“session迁移”等方案,也就是为了解决这个问题。

     

    有状态服务和无状态服务各有优劣,它们在一些情况下是可以转换的,或者有时候可以共用,并非一定要全部否定。

    在一定需要处理请求上下文的情况下又想使用无状态服务,可以将相关的请求信息存储到共享内存中或者数据库中,参考分布式session的实现方式:

    1.基于数据库的Session共享

    2.基于NFS共享文件系统

    3.基于memcached 的session

    4. 基于resin/tomcat web容器本身的session复制机制

    5. 基于TT/Redis 或 jbosscache 进行 session 共享

    6. 基于cookie 进行session共享

     

    或者在业务实现上,将上下文需要的信息在请求中返回,在客户端中进行存储,只不过,这个方案存在技术风险,需要用一定的手段规避。

    展开全文
  • 有状态和无状态服务是两种不同的服务架构,两者的不同之处在于对于服务状态的处理。服务状态是服务请求所需 的数据,它可以是一个变量或者一个数据结构。无状态服务不会记录服务状态,不同请求之间也是没有任何关系...
  • 无状态服务(stateless service) 一、定义 无状态服务(stateless service)对单次请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,要么都包含在这个请求里,要么可以从外部获取到(比如说...
  • kubernetes:有状态服务,无状态服务

    千次阅读 2019-12-03 10:16:42
    我们经常听到部署服务的时候是有状态的还是无状态的,那么到底这两种服务该怎么区分呢?具体怎么用呢? 知识点: **无状态应用(Stateless Application)**是指应用不会在会话中保存下次会话所需要的客户端数据。每...
  • 无状态服务 VS 有状态服务

    千次阅读 2019-01-15 11:47:10
    对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系。如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用...
  • 无状态服务(stateless service)(续)

    千次阅读 2018-03-05 04:25:58
    数据服务,正如其名,可以向应用提供数据存储与访问的服务。 比如一个游戏场景服务器,可以在玩家进入的时候,向数据服务请求该玩家的数据。逻辑中处理不同玩家的数据交互,修改不同玩家的数据,然后以一定策略再将...
  • 无状态服务VS有状态服务

    万次阅读 2016-12-26 19:02:17
    在网易蜂巢的服务管理中存在两种服务:无状态服务和有状态服务。无状态服务(Stateless Service): 是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。这...
  • 无状态服务和有状态服务

    万次阅读 2016-11-26 19:16:50
    对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系。如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用...
  • 对于无状态服务,首先说一下什么是状态:如果一个数据需要被多个服务共 享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个“状态”数据的 服务被称为有状态服务,反之称为无状态服务。 那么这个无状态...
  • 对于服务器程序来说,有个基本假设,即服务器是基于状态请求,还是基于无状态请求。根据这个假设,可以将服务器划分为状态服务器和无状态服务器。状态服务器如果是状态化请求,那么服务端一般需要保存请求的相关信息...
  • 无状态服务 客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份。服务端不保存任何客户端请求者信息。 无状态的好处? 客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务 ...
  • k8s有状态与无状态的区别

    千次阅读 2021-11-29 14:26:10
    无状态服务:deployment Deployment被设计用来管理无状态服务的pod,每个pod完全一致.什么意思呢? 无状态服务内的多个Pod创建的顺序是没有顺序的. 无状态服务内的多个Pod的名称是随机的.pod被重新启动调度后,它的...
  • 无状态应用只提供一项服务或功能, 无状态事务的典型示例是执行在线搜索,寻找您想要的答案。您在搜索引擎中输入问题,然后按 Enter。如果您的事务被意外中断或关闭,则只需重新开始即可。我们不妨将无状态事务看作...
  • 在基于状态的Web服务中,Client与Server交互的信息(如:用户登录状态)会保存在Server的Session中。再这样的前提下,Client中的用户请求只能被保存有此用户相关状态信息的服务器所接受和理解,这也就意味着在基于状态...
  • 比如:自己的苹果手机显示无服务状态,导致自己无法拔打通电话这种情况。那么,苹果手机显示无服务怎么办。苹果手机没有服务其主要原因首先是外界没有网络信号, 其二设置出了问题,其三是手机卡出现了问题,其四是...
  • 服务器无状态与有状态解释

    千次阅读 2018-01-25 23:06:38
    对于服务器程序来说,有个基本假设,即服务器是基于状态请求,还是基于无状态请求。根据这个假设,可以将服务器划分为状态服务器和无状态服务器。 状态服务器 如果是状态化请求,那么服务端一般需要保存请求的...
  • 有状态和无状态服务器

    千次阅读 2009-02-27 09:28:00
    1、无状态与有状态的服务器 服务器维护的、跟正在进行的客户端交互活动有关的信息称为状态信息。不保存状态信息的服务器称为无状态服务器,反之称为有状态服务器。 对高效率的要求,促使设计者再服务器内保存状态...
  • http无状态协议如何保存用户状态

    千次阅读 2019-08-05 22:39:23
    http无状态协议如何保存用户状态http无状态协议如何保存用户状态? http无状态协议如何保存用户状态? HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自 身不对请求和响应之间的通信状态进行保存。也...
  • 对服务器程序来说,有两个基本假设十分重要,究竟服务器是基于状态请求还是无状态请求。状态化的判断是指两个来自相同发起者的请求在服务器端是否具备上下文关系。如果是状态化请求,那么服务器端一般都要保存请求的...
  • 什么是有状态登录和无状态登录

    千次阅读 2019-05-14 21:55:29
    1、有状态登录 那缺点是什么? • 服务端保存大量数据,增加服务端压力 • 服务端保存用户状态,无法进行水平扩展 ...• 客户端请求依赖服务端,多次请求必须访问同一...2、无状态登录 服务器不保存用户的登录信...
  • 应用的无状态和有状态!

    千次阅读 2019-11-14 15:39:06
    应用的无状态和有状态! 什么是有状态和无状态 ? 场景: 当用户登录时,将session或者token传给应用服务器管理,应用服务器里持有用户的上下文信息,这时应用服务器是有状态的 . 同样用户登陆时,我们将session或token...
  • 在面试中被问到HTTP协议是有状态还是无状态的,当场就有点懵,因为不会就没答出来。还是得总结一下啵! 一、HTTP协议的状态 HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。 也就是说,上一次的...
  • TCP有状态协议与HTTP无状态协议

    千次阅读 2021-02-03 16:35:33
    http协议是无状态协议,即下一次的http请求与上一次的http请求没有任何关系,没有任何上下文关系,即不记录上下文。但是TCP是有状态的协议,TCP下一次传输的报文段和上一次传输的报文段是有关系的,最终要按照报文段...
  • 无状态和有状态

    千次阅读 2018-07-19 18:53:35
    对服务器程序来说,究竟是有状态服务,还是无状态服务,其判断依旧是指两个来自相同发起者的请求在服务器端是否具备上下文关系。如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 939,969
精华内容 375,987
关键字:

无状态服务

友情链接: AssignmentDIP.rar