SOAP、XML-RPC和REST的性能比较

47

关于使用XML-RPC或REST解决方案的简单性的论点易于理解,难以反驳。

我经常听到的另一个论点是SOAP增加的开销可能会显着影响使用的带宽,甚至可能会影响延迟。我想看到一项测试结果来量化这种影响。有人知道这方面信息的好来源吗?

8个回答

64
SOAP与REST在速度方面的主要影响与传输速度无关,而是与可缓存性有关。REST建议使用Web语义而不是试图通过XML隧道进行传输,因此RESTful Web服务通常被设计为正确使用缓存头,因此它们可以很好地与Web标准基础设施(如缓存代理甚至本地浏览器缓存)配合使用。此外,使用Web语义意味着像ETag和自动压缩等内容都是提高效率的良好理解方式。
现在你说你想要基准测试。嗯,在Google的帮助下,我找到了一个人的测试结果,显示REST比SOAP快4-6倍,还有一篇论文也支持REST。

3
非常好的回答pjz,你是否意识到你的答案没有涉及XML-RPC或者为什么它不是首选之一。 - Chibueze Opata
1
更新了“一个人”的链接 http://www.learnosity.com/techblog/2008/03/cfmx-soap-vs-rest-benchmarks/ - Fedearne

19

REST作为一种协议并没有定义任何形式的消息信封,而SOAP却有这个标准。

因此,试图比较这两者有点过于简单化了,它们就像是苹果与橙子之间的比较。

话虽如此,一个SOAP信封(不包括数据)只有几KB,所以如果您通过SOAP和REST同时检索序列化对象,则在速度上不应该存在明显的差异。


1
我认为说REST不定义消息信封是不真诚的;它说“使用http使用的内容类型”,也就是mime-types。 - pjz
哦,真的吗?我想发送一个序列化的C#类,那么REST协议的消费者如何知道如何从MIME类型中解析它呢? - FlySwat
24
我认为问题出现在你试图将REST视为一种协议时。REST是一种可以使用HTTP协议的架构风格。 - Darrel Miller
我理解这个问题是在使用"REST"时,通常是指"XML over HTTP"或者较少见的"自定义格式 over HTTP"。在这种情况下进行比较是一个有效的问题。 - Tim Cooper
2
@Tim Cooper - 创造了REST术语的人会强烈反对这种说法,大多数帮助传播REST概念的人也会这样。请阅读维基百科上关于REST的更多信息,希望您能理解为什么REST !== XML over HTTP - MikeSchinkel

8

SOAP和其他使用XML的协议通常会使您的消息变得臃肿 - 这可能是一个问题,也可能不是,这取决于上下文。

类似JSON的东西会更加紧凑,也许序列化/反序列化速度更快 - 但不要仅仅因为这个原因就专门使用它。在任何时候都要做出有意义的决策,并在出现问题时进行更改。

除非重用HTTP 1.1 keepalive连接(许多实现不会),否则使用HTTP的任何内容都会为每个请求启动一个新的TCP连接; 这非常糟糕,特别是在高延迟链路上。 HTTPS更糟。如果您有很多来自一个发送方到一个接收方的短请求,请考虑如何消除这种开销。

无论是SOAP还是其他任何RPC协议,使用HTTP总是会产生这种开销。其他RPC协议通常允许您保持连接。


6

关于这个问题,已经有一些研究,您可能会觉得很有启发性。请参见以下内容:

此外,还有一个(有点过时的)有趣的性能对话主题在MSDN论坛上。

简而言之,大多数来源似乎都认为SOAP和REST在一般数据的性能方面大致相同。然而,一些结果似乎表明,在处理二进制数据时,REST的性能实际上可能会更低。有关此更多详细信息,请参见我链接的论坛中的链接。

5

对“pjz”答案的进一步解释。

如果您正在接收大量基于SOAP操作的INFORMATION(get*类型的调用),目前没有办法进行缓存。但是,如果您使用REST实现这些相同的操作,则有可能可以缓存数据(取决于您的业务背景),如上所述。因为SOAP在其操作中使用POST,所以它无法在服务器端缓存信息。


4

SOAP明显更慢。负载(Payloads)更大,需要更长时间来组装、传输、解析、验证和处理。


2
我不知道如何回答基准测试问题,但我知道关于SOAP格式的信息:是的,它确实有开销,但是这种开销不会随着每个请求而增加:如果您向Web服务发送一个元素,则会产生开销+一个元素构造,如果您向Web服务发送1000个元素,则会产生开销+ 1000个元素构造。开销发生在将XML请求格式化为特定操作时,但请求中的每个单独参数元素都以相同的方式进行格式化。
如果您坚持使用可重复、短时间的数据(例如500个元素),则速度应该是可以接受的。

0

我想这里的主要问题是RPC和SOAP之间的比较。

它们都通过具有存根对象和原始/复杂数据类型的方式提供通信抽象,让您在不真正知道所有底层处理方式的情况下进行操作。

我总是更喜欢(JSON-)RPC,因为

  • 它很轻量级
  • 有许多出色的实现适用于所有编程语言
  • 它易于学习/使用/创建
  • 它很快(特别是使用JSON)

尽管有理由使用SOAP,例如如果您需要命名参数而不是依赖其正确的顺序。

您可以从此stackoverflow question获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接