當我實現了一個非常類似的工作亞軍(生產系統),我結束了每個服務器隨機選擇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次調用),但上述是系統的核心。