我需要根據標識符(自動生成,數字,可重用)創建一個對象的分佈式網絡。如何在圖形的每個節點上創建對象而不會產生衝突?通過網絡的分佈式標識符
目前,我正在使用主節點節點來分配ID,但此解決方案涉及在其他節點上異步創建對象,我想刪除它們。特別是因爲應用程序是實時的,所以RDBMS是不可行的。
我知道這是一個相當經典的分佈式計算問題,但我可能缺乏詞彙來正確搜索。
TCP是我可以使用的唯一協議,並且網絡受延遲影響。萬一它很重要,我正在使用C++,但我正在尋找一種算法,而不是一個庫。
我需要根據標識符(自動生成,數字,可重用)創建一個對象的分佈式網絡。如何在圖形的每個節點上創建對象而不會產生衝突?通過網絡的分佈式標識符
目前,我正在使用主節點節點來分配ID,但此解決方案涉及在其他節點上異步創建對象,我想刪除它們。特別是因爲應用程序是實時的,所以RDBMS是不可行的。
我知道這是一個相當經典的分佈式計算問題,但我可能缺乏詞彙來正確搜索。
TCP是我可以使用的唯一協議,並且網絡受延遲影響。萬一它很重要,我正在使用C++,但我正在尋找一種算法,而不是一個庫。
您可能會喜歡使用UUID s作爲標識符,它們是獨特的設計,因此您不需要任何額外的算法支持。
隨便創建它。隨機值爲128位,碰撞的可能性非常小,您可以假設它爲零。在128位UUID空間碰撞的概率爲2^64(生日悖論)
顯然,你需要一個良好的熵源,經典sha1(time(NULL))
是一個不走;)
更重要的是:如果節點隨機選擇他們的UUID,絕對不需要一個創建UUID並將節點賦予UUID的中央協調器。每個節點自己創建自己的UUID。
除了一次爲主節點分配ID之外,您可以讓它一次爲每個節點分配一個塊或一系列ID。每個節點然後根據需要從該塊內分配ID。
當某個節點變爲ID不足時,它會向主節點請求另一個塊。通過這種方式,節點可以異步創建對象,並保證唯一的ID。
我假設當對象被刪除時,ID被返回到池中以供重用。
如果您不希望主節點負責分發ID,另一種選擇是使用類似以太網MAC地址或IP地址的計數器來補充ID。這要求在網絡上不顯示重複的IP或MAC地址。該ID將大於16位。然而,如果所有節點都在同一網絡上,例如, IP地址AA.BB.CC.DD,則可以使用DD作爲前8位,然後使用後8位作爲計數器。這隻會給每個節點256個ID,這可能是不夠的。如果子網較小,那麼計數器可用的位顯然會增加,這或許足以解決問題。
我喜歡這個想法,但是這對熵的重新分配承擔了太多的責任。在我的應用程序中,節點可能負責創建所有對象,或者每個節點可能創建一個對象。也許調整標識符的大小是訣竅(到32位左右)。 –
好點。我不知道爲什麼我假定對象創建將均勻分佈在節點上。去32位可能允許使用硬件序列號的高位或節點唯一的東西,其餘的位可能是日期+時間或持久計數器。 –
這可能工作,但我擔心的大小開銷。在當前的實現中,我的標識符適合16位。 –
它會比你使用的數量增加8倍 – bobah