演算法 郵件分類的難題 一致性雜湊演算法

2021-06-15 01:49:18 字數 1514 閱讀 2133

小明是郵局的人事部,主要管給郵件分類的人員。最近人員調動比較大,導致遇見了以下難題。

目標:確定每個員工要處理的郵件省份的分配策略。

條件:1)乙個員工如果長時間處理相同省份的郵件,分類效率會提高。

2)隨時有員工離職或者加入,要求實時分配任務。

分析:問題一看就是明白是雜湊直接的對應問題(省份雜湊->員工雜湊),很明顯的應該用雜湊演算法。如果沒有條件一,很明顯的就用普通的hash演算法(hash(object)%n)就行,但考慮條件一,就必須在新增或刪除員工時,不影響(或較小影響)其他在職員工的分配。一致性雜湊就能解決這個問題。

一致性hash:

下面介紹一致性hash演算法,圖都是從網上找的,不屬於原創。

簡單的說一致性hash就是把所有雜湊都通過一種規則(演算法)都分布到乙個圓環上,如下圖

*藍點為員工,紅點為省份

這樣分配策略就出現了,key1分配給a,key4分配給b,key2,3分配給c

如果來了乙個新員工d,新的分布如下圖

分配策略就變成了,key1分配給a,key4分配給b,key2分配給d,key3分配給c。可以看到大部分員工分配的省份都沒有變。

如果走了乙個員工,新的分布如下圖

分配策略就變成了,key1分配給a,key4,2,3分配給c。可以看到大部分員工分配的省份都沒有變。

這樣問題就解決了。

不過又過了幾天,小明又遇到了難題,有個員工b病了,所有的事都交給員工c,c由於工作太多,連續加班好幾天也病了,這樣沒過幾天大家都病了,分郵件的工作完全就沒人做了!!!

這就是所說的雪崩效應,就因為有個員工小生了一下病就會導致系統完全沒法工作。說明上面的分配策略還不完善。

分析:由於單點(員工)暫時離開,導致某點(員工)工作量加倍,超出單點最大處理能力。

解決策略:單點(員工)暫時離開後的任務應該盡可能分配均勻分配到現在可工作的點(員工)。

虛擬節點:

虛擬節點」(

virtual node

)是實際節點在

hash

空間的複製品(

replica

),一實際個節點對應了若干個「虛擬節點」,這個對應個數也成為「複製個數」,「虛擬節點」在

hash

空間中以

hash

值排列。

通過把員工虛擬出多個員工,比如4個員工abcd,每個虛擬出2個,也就是a1a2b1b2c1c2d1d2,hash後可能分布如下a1b1a2c1b2c2d1d2,如果a離開,那b1和c1會得到任務,相當於b,c每人得到了a一半任務,起到均勻的目的。一般可以虛擬幾十到上百個,可以根據實際情況而定。

到此小明的問題也就解決了。

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...