2010-11-08 30 views
0

我有一个需要处理的作业集合,http://example.com/jobs。每个作业都具有“新”,“已分配”或“已完成”的状态。REST风格的作业分配

我希望从属进程选取一个“新”作业,将其状态设置为“已分配”,然后对其进行处理。我想确保每个作业只能由一个从机处理。

我认为让每个奴隶做到以下几点:

  1. GET http://example.com/jobs
  2. 接一个的 “新”,做一个HTTP PUT到http://example.com/jobs/123 { “状态=分配”}。
  3. 重复

的问题是,另一个从可能已经指派工作给自己的GET和PUT之间。我可以让第二个PUT返回一个409(冲突),这将表示第二个奴隶尝试一个不同的工作。

我在正确的轨道上,还是应该以不同的方式做?

回答

0

我有点特别,我并不在乎奴隶会选择这个工作,只是它得到了一个独特的。

考虑到这一点,我认为@曼纽尔阿尔达纳是在正确的轨道上,但我做了一些修改。

我会保留/ jobs资源,但也会公开/ jobs/assigned资源。两个集合中都可能存在单个作业。

从站可以POST到/ jobs /分配不带参数。服务器将选择一个“新”作业,将其移至“已分配”,然后返回位置标题中的URL(/ jobs/assigned/{jobid}或/ jobs/{jobid}),并显示201状态。

当从设备完成作业时,它将放置到/ jobs/{jobid}(status = finished)。

1

我会有一个选择“新”作业并分配它们的过程。其他流程将独立进入并查看是否已分配工作。你必须有一些方法来确定工作分配给哪个进程,因此需要某种从属进程ID。

+0

这增加了复杂性,它迫使我跟踪奴隶。 – 2010-11-08 15:24:39

0

(你也可以使用POST,因为你试图做的事情不应该是幂等的)。

您可以给每个客户一个唯一的ID(可能是一个UUID),并在您的工作资源中有一个“受理人/工人”字段。

  1. GET http://example.com/jobs/
  2. POST { “工人”= $身份识别码}到http://example.com/jobs/123
  3. GET http://example.com/jobs/123,检查作业人员ID是客户端的

你可以用条件结合本也请求。

最重要的是,如果作业队列没有从给定的客户端收到回复,它可能会有超时功能,它会将其放回队列中。

0

它看起来状态是你的工作领域模型的重要组成部分。所以,我会下,这种专用子资源

 

# 'idle' is what you called 'new' 
GET /jobs/idle 
GET /jobs/assigned 

# start job 
PUT /jobs/assigned/123 
 

从只允许通过GET /jobs/idle收集工作。这绝不包括正在运行的作业。仍然有可能存在竞争条件(两名奴隶在获得集合之前,在他们开始工作之前)。我认为400错误请求或你提到的409冲突是可以的。

我更喜欢上面的资源结构,而不是使用有效负载(这对我来说通常看起来更“程序化”)。

+0

400错误请求适用于未理解的请求(格式不正确等),不适用于冲突/不可用。另外,如果您想要一个RESTful系统,请使用有效载荷:http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven – Bruno 2010-11-08 18:10:33

+0

是啊,您是对的,409也许更具表现力。关于有效载荷:我并不是说你不应该使用有效载荷(当然每个作业都应该有有效载荷的表示,包括其状态信息)。但我不喜欢使用'action-payloads'(如果我发送触发器 - 有效载荷来启动作业,情况就会如此)。 – 2010-11-08 18:26:04