2010-11-08 34 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