给出了提交给父母工作人员的有效载荷:
- 我将工作划分为其他工人,然后将父母工人的任务添加为有效载荷中的附加属性
- 其他工人完成了对 的负责
我想要的是知道5或10或20名其他工人是否被排队/踢开,那么他们什么时候完成?因为当所有这些都完成后,我想开始工作流的下一部分:NextWorker!
所以理想的管道是: parentWorker > X # of otherWorkers > everyone done? > nextWorker
我该如何实现?
请不要使用基于民意调查的解决方案回答。我不是在寻找。
我想到使用缓存:
- 父母工作人员将设置将创建的其他工人的总#,例如:
cachekey_<parertTaskId>_workersCreated: 10
- 然后,其他工人在完成后将#减少-1,最终计数将达到零:
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
不幸的是,没有自动化/非常简单/内置的方法可以做到这一点。
关于使用缓存的想法,如果您使用redis之类的东西,那是增量,而降低操作是原子质,因此您永远不会得到两位工人获得相同数字的情况。一名工人和一个工人只会恢复零:http://redis.io/commands/decr