给定一个提交给 parentWorker 的有效负载:
- 我将工作分配给 otherWorkers,并将 parentWorker 的 taskId 添加为有效负载中的附加属性
- 每个其他工人完成他们负责的工作
我想知道是否有 5 或 10 或 20 名其他工人排队/开始工作,那么他们什么时候完成?因为当所有这些都完成后,我想开始我的工作流程的下一部分:nextWorker!
所以理想的管道是:parentWorker > X # of otherWorkers > everyone done? > nextWorker
我怎样才能做到这一点?
请不要使用基于轮询的解决方案来回答。我不是在寻找那个。
我想到了使用缓存:
- parentWorker 将设置将创建的 otherWorkers 的总数,例如:
cachekey_<parertTaskId>_workersCreated: 10
- 然后 otherWorkers 将在完成后将 # 原子地减少 -1,最终计数将达到零:
cachekey_<parertTaskId>_workersCreated: 0
但谁应该对该计数采取行动?
a)如果想法是让 otherWorkers 递减它,然后检查值并查看它是否为零并启动 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