当我实现了一个非常类似的工作亚军(生产系统),我结束了每个服务器随机选择jobtypes。这是我的推理 -
的作业从一个用户过剩不应影响其本职工作运行(用户到用户的公平性)的其他用户的机会
一个jobtype的过剩不应该影响其他jobtypes正在运行(用户作业和作业岗位的公平性)
的机会,如果只有一个从一个用户等待运行,所有服务器都应该运行这些作业jobtype(无浪费的容量)
该系统应该“公平地”运行工作,即与等待的用户和工作类型的数量成正比,而不是等待的总工作量(大量的一种工作类型不应该导致调度对其有利)(工作类型公平)
服务器的数量可以变化,且事先不
等待处理的作业,jobtypes和用户的元数据是已知的调度已知的,但不是作业数据(即用户名,jobnames和计数,但不有效载荷)
我也希望每个服务器都是独立的,自己安排自己的工作,而不必知道其他的ř服务器
我上定居的解决方案是通过{用户,jobtype}属性的元组来跟踪等待处理的作业,并且具有每个调度步骤随机选择5元组,并从每个元组最多10个作业到下一个运行。所选择的工作被列入下一个可用的跑步者的名单。每当容量释放出来运行更多的作业(无论是因为作业完成还是由于次要限制,它们都无法运行)时,运行另一个调度步骤以获取更多作业。
作业被原子锁定作为被抓取的一部分;这些锁妨碍了它们被再次提取或参与进一步的调度决策。如果他们未能运行,他们会被解锁,有效地将他们返回到游泳池。锁定超时,所以运行它们的服务器负责保持锁的刷新(如果服务器崩溃,其他服务器将超时锁并将启动并运行它启动但未完成的作业)
对于我的用例,我希望用户A和B的作业A.1,A.2,A.3和B.1分别获得25%的资源(即使这意味着用户A获得了75%的用户B的25 %)。在四个元组之间随机地选择概率收敛到25%。
如果您希望用户A和B每个都有50-50的资源分配,并且A的A.1,A.2和A.3与B的B.1获得了相同的份额,则可以运行两级调度程序,并随机选择用户并从这些用户中选择工作。这将平等地在用户之间分配资源,并且在每个用户的工作中平均分配工作类型。
大量的特定工作类型的工作需要很长时间才能完成,但情况总是如此。通过从各个用户中进行选择,工作类型对作业处理的响应性不会产生负面影响。
可以添加很多次要限制(例如,每秒对linkedin不超过5次调用),但上述是系统的核心。