基于Web服务的架构真的可扩展吗?

时间:2009-03-12 13:51:18

标签: web-services web-applications scalability scaling

每当有人谈论基于服务的架构时,他们通常都会提到可扩展性,而且通常是相同的。但是,似乎使用服务会增加更多开销,而不是减少开销,因为现在有一个协议,比如SOAP或REST。那么,基于Web服务的体系结构是否确实增加了性能优势,因为Web应用程序的用户数量可能会缩小一个数量级?或者是将可扩展性要求简单地卸载到服务上而不是核心应用程序上?

6 个答案:

答案 0 :(得分:3)

可伸缩性和性能是两个不同的东西。是的,基于服务的方法确实增加了网络协议的开销,但这对于能够在域上的任何应用程序中快速采用经过良好测试的服务的好处是最小的牺牲。

如果网络的开销是您要构建的系统的交易破坏者,那么显然SOA对您来说是错误的选择。请记住,必须通过HTTP访问服务。我想你会惊讶一些协议(如net.tcp)的速度有多快。

答案 1 :(得分:2)

请记住,您可以扩展Web服务以在多个服务器上运行,而不会影响客户端。对于紧密耦合的系统,这种方法效果不佳。

答案 2 :(得分:1)

正确设计的SOA允许系统中的每个组件独立于所有其他组件并且并行异步运行,因此性能和可伸缩性(两种不同的东西)仅受系统中最慢/最不可扩展的部分的限制,而不是所有组件串行执行所需的总时间。

SOA并不适用于所有解决方案,所以如果你没有看到任何明显的好处,那么可能没有。

答案 3 :(得分:1)

Web服务不会免费提供可伸缩性。实际上,构建不会扩展的服务非常容易。

他们给你的是建立可扩展性的机会。而且,通过定义良好的服务接口,您可以在需要时更换服务的快速且不可扩展的不可扩展实现。

重要的是不要忘记'SOA'中的'A'。你只需要大肆创建一堆服务就可以搞得一团糟。确保你有一个架构。

迈向可伸缩性的一大步是从基本的,同步的查询/响应类型服务(例如SOAP RPC)转向异步服务。请参阅Hohpe和Woolf的“企业集成模式”

答案 4 :(得分:0)

RESTafarians会提醒你REST不是一个原型 - 它是一种建筑风格。 REST是一种在没有SOAP使用的包装器的情况下直接使用HTTP来提供服务模型的方法。 REST更接近于SOAP。仅凭这一点并不比另一个更好,他们都有自己的位置。

服务模型的可扩展性与“服务”(如在具有大写字母W和资本S的Web服务中)没有直接关系,而是与这些服务的无状态特性直接相关。精心构建的Web应用程序也具有可扩展性,可以说与任何服务驱动的体系结构一样可扩展。

这两个模型之间的区别之一是没有“服务”的Web应用程序与二进制级别的同一进程中的引用模块交互 - 不需要序列化。 Web服务(SOAP或REST)引入了一定程度的序列化,增加了开销。但是,这种开销通常被认为是值得的,因为它提供了重复使用(即,内部驱动应用程序的相同Web服务也可用于使业务合作伙伴满意)。

一个好的体系结构是直接向进程中的本地应用程序公开服务类(不是Web服务,它可以快速混淆!这个上下文中的服务意味着服务于低级业务流程的类) - 利用能够与这些服务进行双向对话。但是,对于业务合作伙伴和其他服务使用,在这些已经过测试的服务类上放置一个瘦Web服务层,以提供与Web服务相同的服务层。

答案 5 :(得分:-2)

好的,我们首先定义“可扩展性”。大多数事情扩展:如果你需要更多的容量,那么你可以简单地在其上投入更多的硬件。但是一些架构“更具可扩展性” - 这意味着什么?它与成本有关:如果每单位增加容量的成本较低,则架构“更具可扩展性”。

在任何架构中,可扩展性一般有三个范围:第一部分有固定成本,因此在一个间隔内它是线性的,斜率为0;超过这一点,斜率增加,在某些时候通常增加容量是非常昂贵的。

如果描述每单位增加容量成本的函数在很大范围内大致呈线性,我们说系统是“线性可扩展的”。显然,希望斜率更小。

所以,现在,当有人询问SOA,SOAP或REST或其他什么的“可扩展性”时,这就是他们所说的。

面向服务的体系结构被称为“更具可扩展性”,因为添加更多容量相对便宜,尽管如您所说,可能存在开销,使您需要更多容量来为单个用户提供服务。这是因为管理大型系统的成本和复杂性的很大一部分来自维护会话状态的需要,即跟踪呼叫之间发生的事情。面向服务的体系结构通过使每个调用相对独立于下一个调用来避免这种情况,RESTful体系结构是限制性的情况 - 所有会话状态都在表示中编码,因此系统的其余部分不需要知道它。当您想要添加容量时,您需要做的就是添加另一台服务器;简单的负载平衡足以将消息路由到新消息。

(请注意,这本身也具有更强的容错能力:如果服务器死机,其他服务器或多或少会自动获取请求,并且没有会话丢失。)

需要大量会话状态的体系结构(如某些J2EE系统)往往扩展性较差,因为管理会话状态需要很多额外的复杂性。

您在旧的基于CGI的体系结构中看到的那种限制性情况是每个用户会话需要完整的重量级进程的情况;我已经看到fork / exec占负载的40-50%的领域中的系统,其中需要一个复杂的软件负载平衡装置,以确保请求总是到达持有会话的机器,以及简单地耗尽流程槽是一个主要问题。一个这样的系统需要购买一个全新的高端Starfire服务器来增加容量。