如何划分工人和汇总结果?

时间:2016-06-16 17:26:41

标签: distributed iron.io ironworker

给定提交给parentWorker的有效负载:

  1. 我将工作分配给其他工作人员,我将parentWorker的taskId添加为有效负载中的附加属性
  2. 其他每个人都完成了他们负责的事情
  3. 我想要的是知道5或10或20名其他工作人员是否排队/开始他们什么时候完成?因为当所有这些都完成后,我想开始我的工作流程的下一部分:nextWorker!

    理想的管道是:parentWorker > X # of otherWorkers > everyone done? > nextWorker

    我怎样才能实现这一目标?

    请不要使用基于投票的解决方案回答。我没有找那个。

    我想过使用缓存:

    1. 其中parentWorker将设置将要创建的其他工作者的总数,例如:cachekey_<parertTaskId>_workersCreated: 10
    2. 然后其他工作者在完成后将#原子减少-1,最终计数将达到零:cachekey_<parertTaskId>_workersCreated: 0但是谁应该按照这个数量行事呢?
    3. a)如果想让其他工人减少它,那么检查一下这个值并查看它是否为零并启动nextWorker ......这在以下情况下存在缺陷:

      cachekey_<parertTaskId>_workersCreated: 2
      otherWorker9 sends -1
      otherWorker10 sends -1
      otherWorker9 checks and otherWorker10 checks
      both get back 0 and both will kick off nextWorker! We only wanted one instance.
      
      b)其他不好的想法:

      cachekey_<parertTaskId>_workersCreated: 2
      otherWorker9 checks and otherWorker10 checks
      neither one kicks off nextWorker because value!==1
      otherWorker9 sends -1
      otherWorker10 sends -1
      its over and noone is left to act on cachekey_<parertTaskId>_workersCreated: 0
      

1 个答案:

答案 0 :(得分:1)

遗憾的是,没有自动/非常简单/内置的方法可以做到这一点。

关于你使用缓存的想法,如果你使用类似Redis的东西,它的递增和递减操作是原子的,所以你永远不会得到两个工人都回到相同数字的情况。一名工人和一名工人只能获得零回报:http://redis.io/commands/decr