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

时间:2011-03-16 17:58:19

标签: terminology stateful stateless

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

我认为重要的是要知道,因为我相信如果我能理解它,我可以编写更好的代码(例如,考虑粒度)。

无论如何,真的很短,这就是我所知道的'有状态与无国籍的对比:

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

无状态(与ASP.NET一样 - 尽管ASP尝试使用ViewStates保持状态): 操作完成后,数据将被传输,实例将被传回线程池(Amorphous)。

正如您所看到的,它是非常模糊和有限的信息(并且非常关注服务器交互),所以如果您能为我提供更多美味的信息,我将非常感激:)

8 个答案:

答案 0 :(得分:71)

有状态应用程序是一个存储自开始运行以来发生或更改的信息的应用程序。任何关于它所处的“模式”,或已经处理了多少记录的公开信息,或其他什么,都使它成为有状态。

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

答案 1 :(得分:68)

无国籍意味着没有过去的记忆。每次交易都像第一次完成一样进行。

有状态表示存在过去的记忆。以前的交易会被记住,并可能影响当前的交易。

<强>无状态:

// 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

答案 2 :(得分:48)

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

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

为了获得更多理解,您可以研究的另一个领域是RESTful Web服务。这些设计是“无国籍的”,与其他尝试以某种方式保持状态的网络技术形成对比。 (事实上​​,你说ASP.NET是无状态的是不正确的 - ASP.NET使用ViewState努力保持状态,并且肯定被定性为有状态。另一方面,ASP.NET MVC是无状态技术)。有许多地方讨论RESTful Web服务的“无状态”(如this博客点),但您可以再次从SO question开始。

答案 3 :(得分:16)

形容词Stateful或Stateless仅指对话的状态,它与为同一输入提供相同输出的函数概念无关。如果是这样的话,任何动态Web应用程序(后面都有一个数据库)将是一个有状态的服务,这显然是错误的。 考虑到这一点,如果我委托任务保持基础技术中的会话状态(例如coockie或http会话)我正在实现有状态服务,但是如果所有必要信息(上下文)都作为参数传递我'实施无国籍服务。 应该注意的是,即使传递的参数是会话状态的“标识符”(例如票证或sessionId),我们仍然在无状态服务下运行,因为会话是无状态的(票证在客户端和客户端之间不断传递)服务器),并且是两个端点,可以说是“有状态”。

答案 4 :(得分:4)

从一个帐户在线转移到另一个帐户的资金是有状态的,因为收款帐户包含有关发件人的信息。 将现金从一个人交给另一个人,这笔交易是无定金的,因为在现金被收回后,给予者的身份不存在现金。

答案 5 :(得分:0)

我们通过使用会话对象来覆盖HTTP无状态行为使Webapps成为状态。当我们使用会话objets时,状态被执行但我们仍然只使用HTTP。

答案 6 :(得分:0)

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

  • 实体类需要有状态
  • 帮助者/工作者类不应该是有状态的。

答案 7 :(得分:0)

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

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

在这种情况下无状态具有明显的资源有效使用...即在请求和响应的单个实例中支持连接...保持连接打开和/或记住的开销上次请求中的任何内容...