代码之家  ›  专栏  ›  技术社区  ›  Ben Noland

休息的工作分配

  •  0
  • Ben Noland  · 技术社区  · 15 年前

    我收集了一些需要处理的工作, http://example.com/jobs . 每个作业的状态为“新建”、“已分配”或“已完成”。

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

    我考虑让每一个奴隶做以下事情:

    1. 得到 http://example.com/jobs/作业
    2. 选择一个“新的”并执行http-put-to http://example.com/jobs/123 “状态=已分配”。
    3. 重复

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

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Bill the Lizard    15 年前

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

        2
  •  0
  •   Bruno    15 年前

    (你也可以使用post,因为你要做的不应该是等幂的)。

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

    1. 得到 http://example.com/jobs/
    2. post“worker”=$myid至 http://example.com/jobs/123
    3. 得到 http://example.com/jobs/123 检查工人ID是否是客户的ID

    您也可以将它与条件请求结合起来。

    除此之外,如果作业队列没有收到来自给定客户机的回音,那么您可以有一个超时特性,它会将它放回队列中。

        3
  •  0
  •   manuel aldana    15 年前

    看起来状态是工作域模型的重要组成部分。所以我将把它作为专用的子资源公开

    
    # 'idle' is what you called 'new'
    GET /jobs/idle
    GET /jobs/assigned
    
    # start job
    PUT /jobs/assigned/123
    
    

    奴隶只能通过 GET /jobs/idle . 这从不包括正在运行的作业。仍然有可能存在种族条件(两个奴隶在其中一个奴隶开始工作之前得到了这套装备)。我认为400个错误的请求或者你提到的409个冲突都可以。

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

        4
  •  0
  •   Ben Noland    15 年前

    我有点具体,我其实不在乎奴隶有没有选择工作,只是它有一个独特的工作。

    考虑到这一点,我认为@manuel aldana是正确的,但我做了一些修改。

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

    从系统可以在没有参数的情况下发布到/jobs/assigned。服务器将选择一个“新”作业,将其移动到“已分配”,并在位置标题中返回状态为201的URL(/jobs/assigned/jobid或/jobs/jobid)。

    从机完成作业后,将放入/jobs/jobid(status=finished)。