给定提交给parentWorker的有效负载:
我想要的是知道5或10或20名其他工作人员是否排队/开始他们什么时候完成?因为当所有这些都完成后,我想开始我的工作流程的下一部分:nextWorker!
理想的管道是:parentWorker > X # of otherWorkers > everyone done? > nextWorker
请不要使用基于投票的解决方案回答。我没有找那个。
我想过使用缓存:
cachekey_<parertTaskId>_workersCreated: 10
cachekey_<parertTaskId>_workersCreated: 0
但是谁应该按照这个数量行事呢?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
答案 0 :(得分:1)
遗憾的是,没有自动/非常简单/内置的方法可以做到这一点。
关于你使用缓存的想法,如果你使用类似Redis的东西,它的递增和递减操作是原子的,所以你永远不会得到两个工人都回到相同数字的情况。一名工人和一名工人只能获得零回报:http://redis.io/commands/decr