1

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

  1. 我将工作分配给 otherWorkers,并将 parentWorker 的 taskId 添加为有效负载中的附加属性
  2. 每个其他工人完成他们负责的工作

我想知道是否有 5 或 10 或 20 名其他工人排队/开始工作,那么他们什么时候完成?因为当所有这些都完成后,我想开始我的工作流程的下一部分:nextWorker!

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

我怎样才能做到这一点?

请不要使用基于轮询的解决方案来回答。我不是在寻找那个。

我想到了使用缓存:

  1. parentWorker 将设置将创建的 otherWorkers 的总数,例如:cachekey_<parertTaskId>_workersCreated: 10
  2. 然后 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
4

1 回答 1

1

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

关于您使用缓存的想法,如果您使用 Redis 之类的东西,它的增量和减量操作是原子的,因此您永远不会遇到两个工作人员都返回相同数字的情况。一名工人和一名工人只能得到零:http ://redis.io/commands/decr

于 2016-06-19T18:11:00.093 回答