任务队列的休息设计

Fre*_*k L 6 rest

我正在设计一个任务队列休息界面并想知道最佳实践。

一个动作是接受队列中的“下一个”任务。

通过接受工作,只有第一个工人才能得到这份工作。

在接受工作之前,工作人员不会知道任务或任务 ID。

现在我想我不能使用 GET 因为它不是幂等的。如果调用 nextTask 两次,你会得到两个不同的工作。所以我想它应该是一个POST。

POST //rest/taskqueue?action=acceptTask

还是我看错了?

Rob*_*den 5

基本上:

  • GET - 读取数据而不修改资源(幂等)。您可以根据需要执行任意数量的 GET,它永远不会修改资源。
  • PUT - 将数据显式放入资源中(非幂等)
  • POST - 在资源中追加数据(非幂等)
  • DELETE - 从资源中删除数据(非幂等)

这就是我要做的。

加入一个新任务:

--> POST http://api.crazyjoes.com/v1/tasks/
--> {"data":{"lulcat":true}}
<-- 202 Accepted
Run Code Online (Sandbox Code Playgroud)

将具有特定 ID 的新任务加入队列:

--> PUT http://api.crazyjoes.com/v1/tasks/393ee7f6-c44a-4b34-86ac-92c9f31a4bc6/
--> {"data":{"lulcat":true}}
<-- 202 Accepted
Run Code Online (Sandbox Code Playgroud)

检索最旧的任务:

--> GET http://api.crazyjoes.com/v1/tasks/oldest/
<-- 200 OK
<-- {"id":123,"data":{"lulcat":true}}
Run Code Online (Sandbox Code Playgroud)

如果队列为空:

--> GET http://api.crazyjoes.com/v1/tasks/oldest/
<-- 204 No Content
Run Code Online (Sandbox Code Playgroud)

出列特定任务:

--> DELETE http://api.crazyjoes.com/v1/tasks/123/
<-- 200 OK
<-- {"id":123,"data":{"lulcat":true}}
Run Code Online (Sandbox Code Playgroud)

如果任务已经被处理...

--> DELETE http://api.crazyjoes.com/v1/tasks/123/
<-- 410 Gone
Run Code Online (Sandbox Code Playgroud)

如果要直接出列最旧的项目...

--> DELETE http://api.crazyjoes.com/v1/tasks/oldest/
<-- 200 OK
<-- {"id":123,"data":{"lulcat":true}}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这个设计似乎并没有解决 OP 的要求,即“通过接受工作,只有第一个工人才能得到工作”。两个工作人员可以独立地获取最旧的任务,因为这种设计在获取最旧的任务时不会使任务出队或将其标记为已声明。一个建议:--&gt;POST http://api.crazyjoes.com/v1/task_distributor &lt;--200 OK 返回并出列(或标记为“已声明”)最旧的任务。 (3认同)