第一種情況
這種情況要求需要分配的任務數量可以動態變化,執行任務的 worker 數量是固定的
經常會有一種場景,比如把 100 個線程均勻分到 8 個核上。把 16 條鏈路的流量均勻分到 8 個端口上。那么我們需要一種能均勻分配的算法。
如下,一個 demo 程序,假設有 4 個核,11 個任務,那么我們可以按如下來分配。
#include <stdio.h>
int main()
{
int count = 11;
int cores = 4;
for (int idx = 0; idx < cores; idx++)
{
int min = count * idx / cores;
int max = count * (idx + 1) / cores;
for (int i = min; i < max; i++)
printf("core %d will run task %d\n", idx, i);
}
}
運行結果如下:
可以看出,任務被均勻分到 core 上。
第二種情況
這種情況要求需要分配的任務數量是個定數,執行任務的 worker 可以是動態變化的
之前做數據中心交換機的時候存在一種情況:交換芯片互聯的 HG 口可能由於某種原因而 down 掉,這時候需要對該端口的流量做平滑切換,盡量保證不丟包!這屬於一種很重要可維護性手段!截至目前(2021)現在阿里巴巴數據中心交換機也是這種方案。
這里假設芯片 A 互聯的 HG 口有最多有9個,那么如果存在端口 DOWN 的情況,可以利用的端口個數為 0-9.
假設當前可用端口為 5 個那么流量分布應該是如下情況:
HG0 | HG1 | HG2 | HG3 | HG4 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
這時候增加一個端口的話應該是如下情況:
HG0 | HG1 | HG2 | HG3 | HG4 | HG5 |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1(X) |
1 | 1 | 1 | 0(X) | 0 |
這時候減少一個端口的話應該是如下情況:
HG0 | HG1 | HG2 | HG3 |
---|---|---|---|
1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
可以看出來每次都是一個標准的均勻分配,那么我們只需要把變化前后的不一樣的地方選出來,這樣只針對性的切換需要變化的流量,就能做到做最小的改動,從而使分配轉移到最佳狀態。
示例代碼后續補上。。。