我有一系列需要处理的作业http://example.com/jobs。每项工作的状态均为“新”,“已分配”或“已完成”。
我希望奴隶进程选择一个“新”作业,将其状态设置为“已分配”,然后处理它。我想确保每个作业只由一个奴隶处理。
我考虑让每个奴隶做以下事情:
问题是另一个奴隶可能已经在GET和PUT之间将作业分配给自己。我可能让第二个PUT返回409(冲突),这将通知第二个奴隶尝试不同的工作。
我是在正确的轨道上,还是应该以不同的方式做到这一点?
答案 0 :(得分:1)
我会有一个选择“新”工作并分配它们的流程。其他流程将独立进入并查看是否已分配工作。您必须有一些方法来确定作业分配到哪个进程,因此需要调用某种从属进程ID。
答案 1 :(得分:0)
(你也可以使用POST,因为你要做的事情不应该是幂等的。)
您可以为每个客户提供唯一的ID(可能是UUID),并在您的工作资源中包含“受让人/工人”字段。
你也可以将它与条件请求结合起来。
除此之外,如果作业队列没有收到来自给定客户端的回复,您可能会有一个超时功能,它会将其放回队列中。
答案 2 :(得分:0)
看起来状态是您的工作领域模型的重要组成部分。所以我将此作为专用子资源公开
# 'idle' is what you called 'new'
GET /jobs/idle
GET /jobs/assigned
# start job
PUT /jobs/assigned/123
只允许奴隶通过GET /jobs/idle
收集工作。这从不包括正在运行的作业。仍然可能存在竞争条件(两个奴隶正在获得该组,在他们开始工作之前)。我认为400 Bad Request或你提到的409 Conflict就好了。
我更喜欢上面的资源结构,而不是使用有效负载(这对我来说通常看起来更“程序化”)。
答案 3 :(得分:0)
我有点具体,我实际上并不在乎奴隶会选择这份工作,只是因为它有一个独特的工作。
考虑到这一点,我认为@manuel aldana走在正确的轨道上,但我做了一些修改。
我将保留/ jobs资源,但也会公开/ jobs /分配的资源。两个集合中可能存在单个作业。
从站可以POST到/ jobs /分配没有参数。服务器将选择一个“新”作业,将其移至“已分配”,并在Location标头中返回201状态的URL(/ jobs / assigned / {jobid}或/ jobs / {jobid})。
当奴隶完成作业时,它将输入/ jobs / {jobid}(状态=已完成)。