【问题标题】:Batching in RESTREST 中的批处理
【发布时间】:2008-09-20 20:52:50
【问题描述】:

对于 Web 服务,将多个服务调用批处理到一条消息中以减少远程调用的数量被认为是一种很好的做法。有没有办法使用 RESTful 服务做到这一点?

【问题讨论】:

  • foreach(RestRequest req in requestBatch) requestResponseList.Add(webService.Call(req));批量调用 RESTful 服务是什么意思?一个请求包含多个请求定义?

标签: wcf rest


【解决方案1】:

如果你真的需要批处理,Http 1.1 支持一个叫做 HTTP Pipelining 的概念,它允许你在收到响应之前发送多个请求。看看here

【讨论】:

  • 同意 - 加上 HTTP 支持保持活动状态,因此通过 HTTP 管道和保持活动状态,您可以在使用相同的 REST API 时获得批处理的效果 - 通常不需要为您的服务提供另一个 REST API
  • 我们这样做并且效果很好。不需要具有尴尬多重性的无关端点。我们在客户端使用org.apache.http.nio.protocol.HttpAsyncRequestExecutor 和他们的SSLNHttpClientConnectionFactory。我们的 weblogic 服务器开箱即用地支持它。
【解决方案2】:

我看不出批处理请求在 REST 中有何意义。由于基于 REST 的服务中的 URL 表示要执行的操作以及要执行它的数据,因此发出批处理请求会严重破坏概念模型。

如果您多次对同一数据执行相同的操作,则例外。在这种情况下,您可以为请求参数传递多个值,也可以在正文中对该重复进行编码(但这仅适用于 PUT 或 POST)。 Gliffy REST API 支持通过

将多个用户添加到同一个文件夹
POST /folders/ROOT/the/folder/name/users?userId=56&userId=87&userId=45

本质上是:

PUT /folders/ROOT/the/folder/name/users/56
PUT /folders/ROOT/the/folder/name/users/87
PUT /folders/ROOT/the/folder/name/users/45

正如另一位评论者指出的,GET 的分页结果可以通过请求参数完成:

GET /some/list/of/resources?startIndex=10&pageSize=50

如果 REST 服务支持它。

【讨论】:

  • 如果您要创建一个将要执行的 REST 操作及其参数作为参数的 GetBatch 操作,该怎么办。然后,可以返回一组结果,由与之相关的 REST 操作键入?这是否也违反了 REST 的概念模型?
【解决方案3】:

我同意达雷尔·米勒的观点。 HTTP 已经支持 HTTP Pipelining,加上 HTTP 支持保持活动状态,让您可以同时将多个 HTTP 操作流式传输到同一个套接字,以避免在将新请求流式传输到服务器之前必须等待响应等。

因此,通过 HTTP 流水线和保持活动,您可以在使用相同的底层 REST API 的同时获得批处理的效果 - 因此您的服务通常不需要另一个 REST API

【讨论】:

    【解决方案4】:

    与 Astoria 的团队很好地利用了多部分 mime 来发送一批电话。与流水线不同,多部分消息可以推断原子操作的意图。看起来相当优雅。

    【讨论】:

      【解决方案5】:

      当然有办法,但需要服务器端支持。据我所知,没有一种万能的方法。

      【讨论】:

        猜你喜欢
        • 2014-07-06
        • 2020-07-26
        • 1970-01-01
        • 2016-08-04
        • 2019-08-22
        • 1970-01-01
        • 2018-12-04
        • 2018-11-07
        • 1970-01-01
        相关资源
        最近更新 更多