为啥使用有状态的 Web 服务是不好的编程,为啥会被允许?

Posted

技术标签:

【中文标题】为啥使用有状态的 Web 服务是不好的编程,为啥会被允许?【英文标题】:Why is it bad programming to use a stateful webservice and why would it be allowed?为什么使用有状态的 Web 服务是不好的编程,为什么会被允许? 【发布时间】:2010-11-02 14:16:25 【问题描述】:

我的组织需要有状态的 Web 服务。然而,我在网上读到的所有地方都说构建有状态的 Web 服务是糟糕的编程,但没有人说出原因。我想我不明白这有什么不好。我也不太明白他们为什么要解决这个问题,让您在网络服务中拥有状态。

所以我想我的问题是,为什么使用有状态的 web 服务是不好的编程,为什么会被允许?

【问题讨论】:

我会以不同的方式看待这个问题——这个服务需要做什么才能是有状态的?这可以创造性地冒烟和镜像吗? 【参考方案1】:

Web 服务的全部目的是以高度可扩展的方式在一个事务中提供一项功能。这意味着要保持简单和原子。

当您必须进行多次调用来执行操作时,您很有可能使交易挂起。客户回来了吗?他们完成了吗?交易应该保持多长时间?他们撞车了吗?应该如何处理回滚?

这些问题的答案可能会对运行服务所需的资源产生根本性影响。这就是为什么每个人都建议一口气完成所有事情的原因。

【讨论】:

优秀的答案!另外,如果你的操作是有状态的,如果服务器出现故障会发生什么? (它会。这就是我们运行服务器集群的原因。)所有状态都将丢失。无状态允许您将请求重新提交到集群中的下一个服务器,就像什么都没发生一样。 完全不正确。 Web 服务是关于远程应用程序之间的通用市场范围集成技术。它们中的大多数是无状态的,因为我们处理的大多数操作都是无状态的......你的回答可能会误导人们使用多个无状态服务,而实际上有状态的方法是正确的,即使考虑到它继承的非功能方面也是如此。【参考方案2】:

以下是我能想到的一些原因:

    维护状态的成本只能由服务器端承担 - 服务消费者很少是 Web 浏览器,因此没有 cookie。这会降低您的服务器性能并增加您的设计复杂性。

    服务消费者是一个智能程序,而不是一个笨拙的浏览器。因此,程序将(几乎总是)保持自己的状态。换句话说,当您提供服务时,您的消费者将准确地请求它想要的数据。在服务器上维护状态变得过时且不必要。

    事务 - 服务是系统中的一个悬空点,因为它的客户端大多是智能的,它们决定何时通知您其状态的变化。这意味着如果您维护状态,您可能必须在服务调用之间等待才能完成事务操作。而且绝对不能保证客户会进行下一次服务调用。

有很多原因,但这些都是我能想到的:)

【讨论】:

【参考方案3】:

我认为这是一种神话

如果 google 可以使他们的有状态 Web 应用程序可扩展,那么我们为什么不能扩展有状态 Web 服务。这完全是关于降低可扩展性的应用服务器。

即使是网站或网络服务,最终目标也是提供更好的服务。如果“有状态”是为了改善您的服务,那么请不要犹豫。

【讨论】:

您可能想澄清您所谈论的是谷歌的哪一部分。主要的 google.com 不是“有状态的”。

以上是关于为啥使用有状态的 Web 服务是不好的编程,为啥会被允许?的主要内容,如果未能解决你的问题,请参考以下文章

如果单例不好,那么为啥服务容器是好的?

为啥都说程序员不好

将 DAO 注入构造函数是不是被认为是不好的做法?如果是这样,为啥?

状态集为啥必须无头服务

为啥使用short不好

为啥/如何 SOAP 是有状态的?