了解无状态互联网[关闭]


15

我正在从桌面开发人员过渡到Web开发人员,并且无法理解为什么HTTP是无状态的。原因是什么?像我这样的桌面开发人员可以通过哪些方式过渡到无状态开发环境?


3
嗨,Brian,Programmers.SE 不是讨论区。您是否需要解决特定的问题?如果是这样,您可以改写您的问题吗?

通常,您让服务器处理会话Cookie内容的详细信息。
FrustratedWithFormsDesigner

我认为现在应该重新开放,因为它有十几个“适当答案”。尤其是因为它是由另一个最近的问题指出的,据说这个问题可以重复该问题。如果不应首先将其放在任何方向,则不能重复。让我们在这里保持理智。

Answers:


18

这是我所见过的无状态互联网的最好解释:

我如何  向我的妻子解释REST
http://www.looah.com/source/view/2284

妻子:罗伊·菲尔丁是谁?

瑞安:有人。他很聪明。

妻子:哦?他做了什么?

Ryan:他帮助编写了第一批Web服务器,然后进行了大量研究,解释了Web为何以这种方式工作。他的名字在该协议的规范中,该协议用于从服务器到浏览器的页面获取。

妻子:它是如何运作的?

瑞安:网络?

妻子:是的。

瑞安:嗯。好吧,这真的很棒。有趣的是,它们都被低估了。我正在谈论的协议HTTP,它能够处理各种由于某些原因而被人们忽略的东西。

妻子:您的意思是http就像我在浏览器中输入的开头一样?

瑞安:是的。第一部分告诉浏览器要使用什么协议。您输入的内容是计算历史上最重要的突破之一。

妻子:为什么?

Ryan:因为它能够描述世界上任何地方的事物的位置。这是网络的基础。您可以将其想像为获取知识和信息的GPS坐标。

妻子:对于网页?

瑞恩:真的。罗伊·菲尔丁(Roy Fielding)那个人,他谈到了我所谈论的研究中这些东西所指向的内容。Web建立在称为REST的建筑风格上。REST提供了资源的定义,这就是这些东西所指向的。

妻子:网页是一种资源吗?

瑞安:有点。网页是资源的表示。资源只是概念。网址-您在浏览器中输入的内容...

妻子:我知道URL是什么。

瑞安:哦,对。这些告诉浏览器某个地方有一个概念。然后,浏览器可以要求该概念的特定表示。具体地说,浏览器要求概念的网页表示。

妻子:还有哪些其他表示形式?

瑞安:实际上,表示是其中很少使用的东西之一。在大多数情况下,资源只有一个表示。但是我们希望将来会更多地使用制图表达,因为到处都涌现出许多新格式。

妻子:喜欢什么?

瑞安:嗯。嗯,这个概念就是人们称之为Web服务。对于许多不同的人来说,这意味着很多不同的事情,但是基本概念是机器可以像人们一样使用网络。

妻子:这又是机器人吗?

瑞安:不,不是。我并不是说机器将坐在办公桌旁浏览网页。但是计算机可以使用相同的协议来回发送消息。我们已经这样做了很长时间,但是当您需要能够与全世界的所有机器通信时,我们今天使用的任何技术都无法很好地发挥作用。

妻子:为什么不呢?

瑞安:因为它们并非旨在像那样使用。当Fielding和他的伙伴开始构建网络时,能够与世界上任何地方的任何计算机进行通信都是一个主要问题。我们在工作中用于使计算机相互通信的大多数技术都没有这些要求。您只需要与一小部分计算机对话即可。

妻子:现在您需要与所有机器对话?

赖安:是的-还有更多。我们需要能够与所有计算机讨论所有其他计算机上的所有内容。因此,我们需要某种方式让一台机器告诉另一台机器有关可能在另一台机器上的资源。

妻子:什么?

瑞安(Ryan):假设您正在与姐姐聊天,而她想借用扫地机或其他东西。但是你没有它-你妈妈有。因此,您告诉姐姐从妈妈那里得到它。这在现实生活中一直都在发生,并且在机器开始讲话时也一直在发生。

妻子:那么,机器如何相互告诉事物在哪里?

Ryan: URL,当然。如果机器需要谈论的所有内容都有对应的URL,那么您已经创建了与名词等效的机器。您和我以及世界其他地方已经同意以某种方式谈论名词,这很重要,是吗?

妻子:是的。

赖安:机器没有通用名词-这就是为什么它们很烂。每种编程语言,数据库或其他类型的系统都有不同的谈论名词的方式。这就是URL如此重要的原因。让所有这些系统互相告知对方的名词。

妻子:但是当我浏览网页时,我并不这么认为。

瑞安:没人。除了Fielding和少数其他人。这就是为什么机器仍然很烂的原因。

妻子:动词,代词和形容词怎么样?

Ryan:您问的很有趣,因为这是REST的另一个重要方面。好吧,动词仍然是。

妻子:我只是在开玩笑。

瑞安:这是一个有趣的笑话,但实际上根本不是个笑话。动词很重要。编程和CS理论中有一个强大的概念,即多态性。这是一种怪异的说法,即不同的名词可以对它们应用相同的动词。

妻子:我不明白。

瑞安:恩。看咖啡桌。名词是什么?杯子,托盘,报纸,遥控器。现在,您可以对所有这些事情做些什么?

妻子:我不明白...

瑞安:你可以买到,对吗?你可以接他们。您可以将它们撞倒。你可以烧掉它们。您可以将这些完全相同的动词应用于坐在那里的任何对象。

妻子:好的...

瑞安:嗯,那很重要。如果不是我能对您说“拿杯”,“拿报纸”和“拿遥控器”怎么办?如果相反,我们需要为每个名词想出不同的动词怎么办?我不能普遍使用“ get”一词,而是不得不为每个动词/名词组合想一个新词。

妻子:哇!那真是怪了。

赖安:是的。我们的大脑以某种方式足够聪明,知道相同的动词可以应用于许多不同的名词。一些动词比其他动词更具体,仅适用于少数名词。例如,我不会开车,我不会喝酒。但是有些动词几乎是通用的,例如GET,PUT和DELETE。

妻子:你不能删除杯子。

赖安:好的,但是您可以将其丢弃。那是另一个笑话,对吗?

妻子:是的。

Ryan:所以无论如何,HTTP(Fielding和他的朋友创建的这个协议)都是关于将动词应用于名词的。例如,当您转到网页时,浏览器会对您键入的URL进行HTTP GET,然后返回一个网页。

网页通常有图像,对不对?这些是单独的资源。网页仅指定图像的URL,浏览器继续运行并在图像上执行更多HTTP GET,直到获得所有资源并显示网页为止。但是这里重要的是,可以将非常不同种类的名词视为相同。名词是图像,文本,视频,mp3,幻灯片还是其他。我可以使用给定URL的相同方式获取所有这些内容。

妻子:听起来像GET是一个非常重要的动词。

瑞安:是的。尤其是当您使用网络浏览器时,因为浏览器几乎都是justGET的东西。他们不会与资源进行很多其他类型的交互。这是一个问题,因为它使许多人认为HTTP仅用于GETing。但是HTTP实际上是将动词应用于名词的通用协议。

妻子:太酷了。但是我仍然看不到这会如何改变。您想要什么样的名词和动词?

赖安:名词在那里,但格式不正确。

想一想,当您在amazon.com上浏览时,正在寻找可以买给我圣诞节的东西。想象每个产品都是名词。现在,如果以机器可以理解的表示形式提供它们,那么您可以做很多整洁的事情。

妻子:为什么机器看不懂正常的网页?

Ryan:因为网页的设计目的是让人们理解。机器不在乎布局和样式。机器基本上只需要数据。理想情况下,每个URL都应具有人类可读和机器可读的表示形式。当机器获取资源时,它将要求机器可读。当浏览器获取人类的资源时,它将要求人类可读。

妻子:那么人们将不得不为所有页面制作机器格式吗?

瑞安:如果有价值的话。

看,我们一直在用很多抽象来谈论这个问题。我们如何做一个真实的例子。您是一名老师-我敢打赌,您在学校里有一个大型计算机系统,或者更有可能拥有三,四个计算机系统,可以让您管理学生:他们所上的课,所获得的年级,紧急联系人,信息有关您教书的书籍等信息。如果系统是基于Web的,那么这里涉及的每个名词可能都有一个URL:学生,老师,班级,书本,房间等。现在,通过URL获取浏览器会为您提供一个网页。如果每个URL都有机器可读的表示形式,那么将新工具锁定到系统上将是微不足道的,因为所有这些信息都可以以标准方式使用。每个系统彼此之间的对话也将变得更加容易。或者,您可以建立一个州或全国范围的系统,该系统能够与每个单独的学校系统进行对话以收集考试成绩。可能性是无止境。

每个系统将使用简单的HTTP GET从彼此获取信息。如果一个系统需要向另一个系统添加内容,则将使用HTTP POST。如果一个系统要更新另一个系统中的内容,则使用HTTP PUT。唯一需要弄清楚的是数据应该是什么样子。

妻子:这就是您和所有计算机人员现在正在从事的工作?确定数据应该是什么样?

瑞安:可悲的是,没有。取而代之的是,绝大多数人忙于编写复杂规范的层,以不同的方式来完成这些工作,而这些方式几乎没有用处或雄辩。名词不是通用的,动词不是多态的。我们将投入数十年的实际使用和可靠的技术,并从一些看起来与过去失败的其他系统非常相似的地方开始。我们使用HTTP只是因为它可以帮助我们减少与网络和安全人员的交流。我们正在为浮华的工具和向导交易简单性。

妻子:为什么?

瑞安:我不知道。

妻子:你为什么不说些什么?

瑞安:也许我会。


1
这是一本好书。因此,按惯例使用http会很容易。正如Slawek指出的那样,我唯一要添加的内容是关于内存限制的信息,我们很快就会用完大型网站的资源。也许有一天,当一台机器的资源与其用户的需求相比时,我们可以拥有状态互联网。
P.Brian.Mackey 2011年

5
我不会太害怕无国籍状态。这只是看事物的另一种方式。随着时间的流逝,您可能会发现这实际上是一种更明智的方法,尤其是对于大型,可伸缩的应用程序。无论如何,您始终可以将状态存储在数据库中,并在后续页面请求中检索该状态。无状态让您更多地考虑事务,而不是更新一点点状态。
罗伯特·哈维

2
我对状态编程的方法视而不见,因此错过了本文的重点。我需要将“无状态不是缺陷”的座右铭敲响我的大脑几百次……感谢您的出色评论和回答。
P.Brian.Mackey 2011年

最后一段引用(末尾有5行)是什么?我有个主意,但我不想像个傻瓜一样做任何假设。
史蒂文

1
@Steven:我认为该段落所指的是SOAP或可能的CORBA(抖动)之类的东西。
罗伯特·哈维

6

您如何看待可能存储数十亿亿亿连接的状态?:)因此,您仅在会话中需要的地方存储状态。

顺便说一句:HTTP不是无连接的。


1
@P。当您引用的参考文献以以下内容
chrisaycock 2011年

3
HTTP是无连接的。您发送HTTP请求,取回一些信息,就HTTP而言,连接已结束。服务器可能会连接不同的请求以形成会话,但这不是HTTP的固有属性。
David Thornley

2
HTTP使用TCP / IP作为传输方式(不是UDP),但这是另一个ISO OSI层,您可以使用persistent connections,称为keep-alive。我不是网络专家,但是,您大多数时候都使用HTTP进行真正的连接:)
Slawek 2011年

2
好的,因此我从中得到的普遍信念是:无连接可以等同于无状态。我想我们可以同意http是无状态的,或者看看规范自己看看w3.org/TR/html401/interact/forms.html(搜索无状态)。有关http ietf.org/rfc/rfc2616.txt的无状态性,另请参阅RFC2616 。有连接,但是连接是“盲继电器”。
P.Brian.Mackey 2011年

2
连接在网络上是虚拟的。从技术上讲,要实现真正的连接,您需要使用专用电线将您连接到另一侧,例如电话线(至少在90年代以内)。如果一侧“断开连接”,则另一侧将不知道,除非它收到一个数据包,表明另一侧不再监听。从理论上讲,该数据包可能永远不会到达。超时后,服务器也会“断开连接”。但是,由于这个原因,连接始终是虚拟的。
尼尔

4

作为桌面开发人员,您可能会更熟悉丰富的UI体验。移至网络就像退后一步一样。在网络世界中,创造的自由更少,它可以带给您束缚的感觉。不要让那让你失望!有很多东西可以帮助您进行过渡,以下是其中的简短列表:

  1. 状态可以共享,但经常保存在服务器上,并使用令牌来引用,例如会话ID,URL参数,隐藏字段或cookie值。
  2. 无状态模型非常适合事务处理。尝试以可以减少所需状态数量的方式构建模型。事务处理的ACID原则可以帮助您实现这一目标。
  3. 熟悉MVC模式(如果尚未熟悉)。通过保持关注点分离,这将有助于改善您的设计。围绕此概念构建了一些流行的框架,例如Struts(Java)和MVC(.NET)。
  4. 考虑使用JavaFlashSilverlight之类的插件来获得超丰富的UI体验。对于半丰富的经验,请考虑使用流行的基于Java脚本的库,例如JQueryAJAX

编程愉快!


1
只是一个旁注:小心使用MVC的缩写;它最初被定义为GUI应用程序的OO设计,后来又被刺入Web应用程序的层体系结构中。这是两个非常不同的事情。
哈维尔

您建议OP直接投入那些可以在无状态的情况下在Web上提供解决方法的技术,而不是先学习基础知识吗?
图兰斯·科尔多瓦

3

因为曾经有一段时间没有数以百万计的网页。因为有时只有大学和研究机构只有几页。曾经有一段时间没有宽带,并且http与放置在台式电话顶部的1200波特调制解调器通信。在他们看来,曾经有一段时间“富Web应用程序”需要大量的带宽。记住,创建TCP / IP是因为早期的Internet非常不可靠。

HTTP 1.0始于1990年代初期。想一想当时的互联网状况,以及为什么他们以自己的方式设计互联网。


“晚期”互联网仍然不可靠。
Pemdas 2011年

@Pemdas-您是什么意思“后期”互联网?
P.Brian.Mackey 2011年

刚采摘。如果没有TCP之类的协议,数据传输仍然不可靠,甚至TCP也无法说明连接不可用。
Pemdas 2011年

3

一切都在演变。Internet早于Web浏览器和Web。这是ftp,telnet,gopher,ping,finger和其他一些东西的冒泡锅。第一个Web浏览器Mosaic(我想是很久以前的1991年,我想是在大学里)充当了ftp和文档查看器之间的混搭。发生魔术的地方是,您可以在文档中具有链接,从而可以通过ftp传送新文档。

在接下来的20年中,我们现已发展出所有互动方式。这也不是一个快乐的发展。我们经历了浏览器大战,IE和Netscape放弃了它来控制标准(简化了一点;)),其他各种第三方也开始引入插件来提供丰富的内容。Java将会成为魔术子弹,当然也将成为Flash。有谁记得VRML插件承诺了3D世界,并提供了六打《星球大战》模型中的精确模型?

我快要走到最后了,但你明白了:)


没关系,很多其他人也被带走了,主要是市场营销人员。除了原始利润动机,我们现在会在哪里?我猜还有些极客“正在连接一些计算机”。

3

主要原因是Aceemia认为HTTP的目的是出于可扩展性的考虑。HTML最初旨在跨学术界共享信息或论文。它是纯风格的文本。直到第一个浏览器允许您提供图片,人们才开始思考该模型之外的其他内容。

以下考虑巩固了无状态决策:

  • 典型的交互是快速下载和阅读。在直到下一个请求的延迟期间,套接字将处于空闲状态。
  • 套接字占用宝贵的系统资源。如果我们不必像使用SMTP那样保持对话,则可以做很多事情,让一台计算机处理数千个客户端。
  • 他们已经从管理远程外壳程序帐户,NFS,SMTP和其他有状态连接协议中学到了宝贵的经验。

随着网页变得更加复杂并包含大量图形和样式表,HTTP的“ keep-alive”标志得到了改进。这样可以使套接字保持活动状态,并允许客户端通过相同的对话请求多个资源。

考虑到当前的互联网使用模式,原始决定仍然有效。有时可能会带来不便,但与服务器进行的几次小型量化交互要好于空闲套接字。


3

如果您的意思是双向浏览器。

安全原因。

例如垃圾邮件!

将网络上的双向通信提升到新的水平

否则,Internet运行TCP / IP(两个协议)和UDP。

传输控制协议(TCP)是Internet协议套件的核心协议之一。TCP是该套件的两个原始组件之一,是Internet协议(IP)的补充,因此,整个套件通常称为TCP / IP。TCP提供直接在同一网络上的两个主机之间交换数据的服务,而IP处理一个或多个网络上的寻址和路由消息。特别是,TCP提供了字节流从一台计算机上的程序到另一台计算机上另一程序的可靠,有序的传递。TCP是主要Internet应用程序所依赖的协议,例如Internet,电子邮件和文件传输之类的应用程序。其他不需要可靠数据流服务的应用程序,

互联网协议(IP)是用于使用Internet协议套件跨Internet中继数据报(数据包)的主要通信协议。负责跨网络边界路由数据包,它是建立Internet的主要协议。IP是Internet协议套件的Internet层中的主要协议,其任务是仅根据其地址将数据报从源主机传递到目标主机。为此,IP定义了数据报封装的寻址方法和结构。从历史上看,IP是Vint Cerf和Bob Kahn在1974年引入的原始传输控制程序中的无连接数据报服务,另一个是面向连接的传输控制协议(TCP)。因此,Internet协议套件通常被称为TCP / IP。


3

在桌面应用程序中,假定用户正在执行一系列具有定义的开始和结束的任务。在这样的应用程序中,让用户登录到提供数据的任何服务器,并保持登录状态直到完成才有意义(实际上不是很多)。

Web交互(通常)不遵循相同的模型。例如,在电子商务站点中,用户可能会由于Google搜索而获得产品说明,然后立即离开该页面以查看另一个站点提供的相同产品。或者他/她可能开始结帐流程,然后确定该产品太昂贵,然后中途放弃。“超文本”的基本思想意味着从一个位置跳到另一个位置的能力和期望。

永久连接消耗资源。也许只是一个网络套接字,也许是一组解析的数据库查询;这一切都取决于应用程序。如果某个用户随时可能消失,那么保留这些资源就没有多大意义。

实际上,用户并不需要永久连接。Web应用程序维护与所需资源(例如数据库)的连接,并在所有用户请求之间共享它们。Web应用程序框架提供了会话,这些会话是有时间限制的位置,用于存储针对不同请求的每用户数据。您唯一无法(轻松地)做的是长期运行的客户端控制的事务,但这即使在维护连接的应用程序中也是一个坏主意。


2

互联网不一定是无状态的-实际上,当您查看Java EE时,它们具有状态EJB和无状态EJB。

开发人员推荐使用无状态架构的主要原因是可伸缩性。想象一下,一旦添加和删除服务器以支持流量,便试图保持所有用户的状态。

开发无状态架构确实不难。要点是保持尽可能少的状态(通常是用户ID,最好是在cookie中),并根据需要更改数据库。


1

我认为它是从这种方式开始的,并且一直保持这种方式。现在围绕它构建了太多的基础架构,因此无法对其进行更改。

也许它开始是无状态的,因为起初连接的可靠性较差,带宽也较小。如果您没有大量活动连接,则可以更轻松地处理更多流量。

如果您有更好的信息,请编辑或发表评论,或者发表您自己的答案!


1

这是因为服务器提供了一项服务(以其名称)。您提出请求并收到答复-就是所有这些。

关于向Web开发的过渡,我相信ASP.NET Web窗体将以一种您更容易理解的方式进行操作-但这仅仅是因为它隐藏了抽象层下实际发生的事情。


我曾是Winforms开发人员,曾经尝试过渡到ASP.NET Webforms。这次经历并不愉快。我非常喜欢ASP.NET MVC。
罗伯特·哈维

好的,我从PHP开始,然后搬了过来。我花了大约6个月的时间才停止在循环中生成HTML
billy.bob 2011年

1

通过分析HTTP(超文本传输​​协议)的名称可以理解很多内容。它从未被设计为丰富的UI协议。最初的想法是共享带有链接的文档。我要求您提供文件,请您提供该文件的副本。

最初,HTTP只有一个动词GET。在这方面,它是为静态内容而设计的。当您正在做的事情是要求某人共享文档时,为什么需要状态?这就是为什么HTTP是无状态的……因为它的起源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.