对于网络来说,什么样的状态比无国籍更好?

时间:2009-07-24 12:45:02

标签: web-applications state

我一直主张无国籍网络,但想知道有状态网站的拥护者在说什么。

你是否有任何有状态比无国籍更合适的情况?

5 个答案:

答案 0 :(得分:8)

我们的项目使用Wicket Web框架,允许有状态或无状态的交互。有状态页面有许多优点:

  • 在wicket中使用有状态页面可以更轻松地使用wicket的AJAX框架执行部分页面更新
  • Stateful是一种更“直观”的编程模型。例如,在wicket页面类中,我可以在服务器端声明一个私有成员字段,在加载页面时设置它,并在每次AJAX请求到达页面以执行某些更新时再次访问它。
  • Wicket通过在处理请求时同步用户会话对象来防止Web层中的大多数常见并发问题。
  • 在服务器端存储状态有时可以提高性能;例如,一个构造但必须可用于页面的对象只能在首次实例化页面时加载一次。

有状态应用程序中的所有可能也可以实现为无状态 - 您只需将状态存储在客户端上,并在每个请求上提交所有相关的状态信息。

链接到检票口:http://wicket.apache.org/

答案 1 :(得分:4)

使用状态通常会使程序员的工作更轻松。

然而,各州还引入了无状态情况下根本不存在的各种并发问题。

这实际上是功能性和命令式编程之间的争论。

答案 2 :(得分:2)

由于可扩展性,我处于有状态的无客户端无状态服务器阵营,但是当面临解释为什么使用无状态服务器实现这一点变得更难的障碍时,从长远来看,你会有点辞职,这就是有状态的服务器闪耀:)。 虽然我更喜欢有状态的客户端,但使用asp.net viewstate并不容易有效实现,也许这就是状态网络实用的地方。 我认为有状态的客户端,无状态服务器让您更加了解轮胎之间来回传输的数据量。在使用有状态服务器编程模型发生故障之前,有时会隐藏这一点。此外,从无状态变为有状态很容易(只是忽略你提供的状态信息,因为你已经知道它了......)。相反的情况几乎不可能/不值得。使用statefull服务器的另一件事是,当您还使用有状态客户端时,清除状态/缓存通常是个问题。它只是不直观和令人困惑,或者只是我的maby :)

无论如何,由于可扩展性问题,GWT和许多其他现代工具包(Silverlight与WCF交谈)似乎更喜欢有状态客户端,无状态服务器。也许有状态服务器应该是无状态规则的例外...可以选择每页/窗口。

来源: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/2871ef5076c1bdb6/43e7a5377047aa44?#43e7a5377047aa44

答案 3 :(得分:2)

当您开始拥有更高的流量时,无状态Web应用程序是必不可少的。

例如,出于安全原因,您可能不希望在客户端存储大量用户数据。在这种情况下,您需要将其存储在服务器端。您可以使用Web应用程序默认会话,但如果您有多个应用程序实例,则需要确保每个用户始终定向到同一实例。

负载均衡器通常具有“粘性会话”的能力,其中负载均衡器可以知道哪个服务器向用户发送请求。这并不理想,例如,这意味着每次重新启动Web应用程序时,所有连接的用户都将丢失会话。

更好的方法是将Web服务器后面的会话存储在某种数据存储中,现在有很多很好的nosql产品可用于此(redis,mongo,elasticsearch,memcached)。这样,Web服务器是无状态的,但您仍然具有状态服务器端,并且可以通过选择正确的数据存储设置来管理此状态的可用性。这些数据存储通常具有很强的冗余性,因此几乎总是可以对Web应用程序甚至数据存储进行更改,而不会影响用户。

答案 4 :(得分:1)

长状态(实际上任何需要多次刷新页面的东西)都可以通过持久状态轻松实现,因为您可以通过简单直接的方式实际跟踪用户所在的页面/阶段。但是,我个人并不认为这样的小优势是值得的,但它在很大程度上取决于相关的Web应用程序。