设计模式征求意见:推模型与拉模型

Geo*_*ge2 6 architecture design-patterns

我的应用程序有几个工作人员(作为不同的进程处理不同的事情)和一些资源(工作单位).不同的工人需要处理所有工作单位.例如,我有像W1,W2和W3这样的工人,工作单位U1和U2.然后W1需要处理U1和U2,与W2和W3相同.限制是不同的工人不能同时在同一个工作单位工作.

我有两个设计,想要求一个更好的建议.

  1. 推模型:使用中央作业调度程序将工作单元分配给不同的工人,以确保不同的工人不在同一工作单元上工作;
  2. 拉模型:每个工作人员都会要求中央作业调度程序处理工作单元,并且作业调度程序将选择一个适当的工作单元,该工作单元不会被其他工作人员处理.

我想知道每个设计的优缺点.我的一个主要问题是 - 寻找松散耦合的设计(这是我的主要目标之一,但不是唯一的目标).我不确定推模型或轮询模型是否具有更好的可扩展性(选项1是否更松散耦合)?

乔治,提前谢谢

jld*_*ont 4

“拉”模型的优点是每个工作人员在本地知道它加载了多少,因此可以管理其负载。

此外,“拉”模型可能更加“解耦”,因为“负载”变量保留在工作人员本地,而在“推”模型中,需要通信协议(和开销)来传达此状态。


想想汽车行业“拉动”模式的成功:它从库存难以跟踪且需要大量反馈的传统“推”模式转变为现在成功且无处不在的“拉”模式。


当涉及到扩展时,您可以有一个中间层的“调度程序”,用于从上面的层“轮询”作业。基础工作人员现在可以以分区的方式与中间层进行交互。


请注意,在任一模型中都需要协调通信协议:不同的是协调协议的性质。在“推送模型”中,需要一个额外的控制循环来报告/轮询每个工作人员的“负载系数”。随着系统规模的扩大,需要更多的带宽、调度程序端的更多状态、产生更多的延迟等。