无状态与有状态

Posted

技术标签:

【中文标题】无状态与有状态【英文标题】:Stateless vs Stateful 【发布时间】:2011-07-16 19:44:20 【问题描述】:

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

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

无论如何,真的很短,这就是我所知道的“有状态与无状态”:

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

无状态(类似于 ASP.NET - 尽管 ASP 尝试使用 ViewStates 来保持状态): 动作完成后,数据被传输,实例被交回线程池(Amorphous)。

如您所见,它的信息非常模糊和有限(并且非常关注服务器交互),所以如果您能提供一些更有趣的信息,我将不胜感激:)

【问题讨论】:

【参考方案1】:

无状态表示没有过去的记忆。每笔交易都像第一次一样执行。

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

无状态:

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

有状态应用是一种存储有关自开始运行以来发生或更改的信息的应用。任何关于它处于何种“模式”的公共信息,或已处理的记录数量,或其他任何信息,都使其成为有状态的。

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

好的,感谢您提供的信息,我查看了链接,发现了一些有趣的信息!虽然我仍然愿意接受更多;) 我添加了另一个领域,即有状态和无状态是一个重要因素(RESTful Web 服务)。 感谢您的信息!我会投票赞成你的答案,但我还没有足够的代表>_> 许多网络应用程序都是有状态的,因为相同的注册页面会为用户信用提供不同的结果...第一次注册将成功...第二次使用相同的输入注册将失败...因为 webapp在某处存储了用户的状态......它可能是数据库或不同的存储【参考方案4】:

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

【讨论】:

不确定在每个请求上传递session identifier 是否可以被视为无状态。在我看来,这种情况将被认为是有状态的。但是,如果您始终为用户传递 token 但没有任何其他状态,那么它就是无状态的。但是感觉很有状态XD。这太令人困惑了。【参考方案5】:

从一个帐户在线转移到另一个帐户的资金是有状态的,因为接收帐户具有有关汇款人的信息。 将现金从一个人转移给另一个人,这种交易是无状态的,因为在收到现金后,送出者的身份就没有现金了。

【讨论】:

【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

我们通过使用会话对象覆盖 HTTP 无状态行为来使 Web 应用程序有状态。当我们使用会话对象时,状态会被携带,但我们仍然只使用 HTTP。

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于无状态与有状态的主要内容,如果未能解决你的问题,请参考以下文章

无状态与有状态微服务

Flutter 状态管理(BloC):无状态与有状态小部件

Java 持久性应用程序无状态与有状态

IPv6技术系列⑥——IPv6 SLAAC与有状态自动配置

Flink流处理- 数据流操作

javaEE设计模式——门面模式