如何支持REST风格的资源是其他资源的集合的创建和避免HTTP由于DB制作超时?(How to RE

2019-09-30 08:07发布

在我的应用我有平局的概念,并绘有总是被包含在订单中。

平局有一组属性: background_color, font_size, ...

引用著名的REST的论断:

可名可以是一个资源的任何信息:文档或图像,时间服务(例如,“今天的天气洛杉矶”),其他资源的集合,非虚拟对象(例如人),等等。

所以,我的其他资源的收集这里将是一个订单。 订单是一组绘制(通常超过十万)。 我希望让用户创建一个订单与几个绘制,这里是我的第一种方法:

{
    "order": {
      "background_color" : "rgb(255,255,255)", "font_size" : 10,
      "draws_attributes": [{
            "background_color" : "rgb(0,0,0)", "font_size" : 14
        }, {
           "other_attribute" : "value",
        },
       ]
       }
}

为了对此作出回应是这样的:

"order": {
          "id" : 30,
          "draws": [{
                "id" : 4
            }, {
               "id" : 5
            },
           ]
           }
    }

因此用户会知道哪些资源已在数据库中创建。 然而,当有许多借鉴的要求,因为所有这些画被插入到数据库中,反应需要一段时间。 试想一下,做10.000插入如果订单10.000平局。

因为我需要给用户的是刚刚创建的(顺便说一句,创建,但还没完,因为当订单已处理我们真正建立了一些图像处理库绘图)平局的ID,以便他们可以在以后获取它们,我看不出如何处理这个REST方式,避免使HTTP请求采取了很多时间,但在同一时间,使用户的某种标识为平局,让他们可以在以后获取它们。

你如何应对这种情况?

Answer 1:

接受请求批发,排队处理,返回表示请求的状态的状态URL。 当请求被处理完毕,呈现表示请求的结果的URL。 然后,调查。

POST /submitOrder

301
Location: http://host.com/orderstatus/1234

GET /orderstatus/1234

200
{ status:"PROCESSING", msg: "Request still processing"}

...

GET /orderstaus/1234

200
{ status:"COMPLETED", msg: "Request completed", rel="http://host.com/orderresults/3456" }

附加物:

嗯,有几个选项。

1)他们可以等待结果进行处理,并获得ID时,它的完成,就像现在一样。 什么我建议不同的是,在网络连接的状态不依赖于交易的成败。

2)你可以进入数据库之前预先分配的订单ID,并返回那些给调用者。 但要注意,这些资源尚不存在(他们不会,直到完成处理)。

3)加快您的系统到超时,根本就不是一个问题。



Answer 2:

我认为你暴露的粒度太细-没有用户需要能够修改每个Draw分别? 如果不是,则呈现代表的文档Order ,以及天然含有的Draw秒。

你将需要查询的具体Draw依据是无关的具体标准从数据库,这Order ? 如果没有,则代表所有的Draw S作为单个斑点是表示一个行的一部分Order



文章来源: How to RESTfully support the creation of a resource which is a collection of other resources and avoiding HTTP timeouts due to DB creation?