无状态与有状态-我可以使用一些具体信息


93

我对某些文章感兴趣,这些文章提供了有关编程中无状态和有状态设计的一些具体信息。我很感兴趣,因为我想了解更多有关它的信息,但是我真的找不到任何有关它的好文章。我已经在网上阅读了数十篇文章,这些文章含糊地讨论了这个主题,或者他们谈论的是Web服务器和会话-它们也“关于有状态与无状态,但是我对编码中的无状态与有状态设计感兴趣” 。示例:我听说BL类在设计上是无状态的,实体类(或者至少我称之为类-如Person(id,name,..))是有状态的,等等。

我认为知道这一点很重要,因为我相信,如果我能理解它,就可以编写更好的代码(例如,注意粒度)。

总之,简而言之,这就是我所说的“有状态与无状态”:

有状态的(例如WinForms):存储数据以供进一步使用,但由于受CPU或内存限制的限制,因此限制了应用程序的可伸缩性

无状态(类似于ASP.NET-尽管ASP试图使ViewStates保持有状态):完成操作后,将传输数据,并将实例交还给线程池(无定形)。

如您所见,这是非常模糊和有限的信息(并且非常侧重于服务器交互),因此,如果您能为我提供更多美味的信息,我将不胜感激:)

Answers:


58

我建议您从StackOverflow中的一个问题开始,该问题讨论无状态编程的优点。这更多地是在函数式编程的上下文中,但是您将阅读的内容也适用于其他编程范例。

无状态编程与函数的数学概念有关,当用相同的参数调用该函数时,总是返回相同的结果。这是函数式编程范例的关键概念,我希望您能够在该领域找到许多相关文章。

您可以研究以获得更多了解的另一个领域是RESTful Web服务。与其他试图以某种方式保持状态的Web技术相比,这些设计上是“无状态的”。(实际上,您所说的ASP.NET是无状态的是不正确的-ASP.NET努力使用ViewState来保持状态,并且肯定被描述为有状态的。另一方面,ASP.NET MVC是无状态技术)。有很多地方讨论RESTful Web服务的“无状态性”(例如博客),但是您可以再次从SO 问题开始。


好了,谢谢您提供的信息,我看了一下链接,发现了一些有趣的信息!尽管我仍然愿意接受更多;)
Team-JoKi 2011年

我还添加了另一个领域,即有状态和无状态是一个重要因素(RESTful Web服务)。
kgiannakakis 2011年

谢谢(你的)信息!我会投票赞成您的答案,但我没有足够的代表> _>
Team-JoKi 2011年

许多Web应用程序都处于全状态,因为同一注册页面会给用户信用带来不同的结果..第一次注册将成功...第二次具有相同输入的注册将失败..因为Webapp在某处存储了用户状态。 .it可能是数据库,也可能是其他存储
感觉不错,正在编程

83

无状态意味着没有对过去的记忆。每笔交易都好像是第一次完成一样。

有状态意味着对过去的记忆。之前的交易会被记住,并可能影响当前的交易。

无状态:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

有状态:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

请参阅: https //softwareengineering.stackexchange.com/questions/101337/whats-the-difference-between-stateful-and-stateless


73

状态应用程序是一种用于存储自开始运行以来发生的事情或更改的信息的应用程序。有关其处于何种“模式”或已处理了多少记录的任何公共信息,或任何使其变为有状态的信息。

无状态应用程序不会公开任何信息。它们每次都对相同的请求,函数或方法调用给出相同的响应。HTTP的原始格式是无状态的-如果对特定的URL进行GET,则每次(理论上)都会得到相同的响应。当然,例外是当我们开始在顶部添加有状态性时,例如使用ASP.NET Web应用程序:)但是,如果您想到的是仅包含HTML文件和图像的静态网站,您就会明白我的意思。


18

形容词“有状态”或“无状态”仅指对话的状态,与功能的概念无关,后者为相同的输入提供相同的输出。如果是这样的话,任何动态Web应用程序(后面有数据库)将是有状态服务,这显然是错误的。考虑到这一点,如果我委托任务在基础技术中保持对话状态(例如coockie或http会话),则我正在实现有状态服务,但是如果所有必要的信息(上下文)都作为参数传递, m实施无状态服务。应该注意的是,即使传递的参数是会话状态的“标识符”(例如票证或sessionId),我们仍然在无状态服务下运行,


不知道session identifier在每个请求上传递a是否可以视为无状态。我认为,这种情况将被视为有状态的。但是,如果您始终token为用户传递a ,但不保持其他任何状态,那它就是无状态的。但是感觉有状态的XD。这真令人困惑。
7hi4g0 2014年

4

从一个帐户在线转移到另一个帐户的资金是有状态的,因为收款帐户具有有关发件人的信息。将现金从一个人移交给另一个人,此交易是无状态的,因为在取回现金后,提供者的身份就不会与现金一起出现。


1

只是增加其他人的贡献。...另一种方法是从Web服务器和并发的角度来看它。

HTTP本质上是无状态的,这是有原因的……在Web服务器中,有状态意味着它必须记住用户的上一次连接的“状态”,和/或保持与请求者的开放连接。在具有数千个并发连接的应用程序中,这将非常昂贵且“压力很大”。

作为无国籍在这种情况下,拥有资源的明显有效使用...即支持在请求和响应的单个实例连接...没有开销保持连接的打开和/或还记得最后一次请求什么...



-3

我对有状态v / s无状态类设计也有同样的疑问,并做了一些研究。刚刚完成,我的发现已发布在我的博客中

  • 实体类必须是有状态的
  • 助手/工作者类不应是有状态的。
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.