新聞中心
這篇文章主要介紹“rabbitmq Hash沖突和一致性相關問題舉例分析”,在日常操作中,相信很多人在rabbitmq Hash沖突和一致性相關問題舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”rabbitmq Hash沖突和一致性相關問題舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網技術服務公司,擁有項目網站制作、網站建設網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元宜陽做網站,已為上家服務,為宜陽各地企業(yè)和個人服務,聯(lián)系電話:028-86922220
問題1: hash沖突的問題?
1. 背景介紹:
在數(shù)據量很大的時候,就會出現(xiàn)hash之后的數(shù)值,指向相同的位置,也就是所謂的hash沖突。這個取決于hash算法的好壞,以及數(shù)據量的大小,hash算法越差,數(shù)據量越大,hash沖突的概率就會越大。
2. 然而一旦出現(xiàn)了hash沖突,我們該怎么辦呢?
首先,我們應該考慮能不能找一個更高級的hash算法來解決,讓hash值盡量均勻,沖突盡量的少。
其次,我們要想辦法來解決hash沖突的問題,目前最常用的解決辦法是"鏈表法",也就是說,在不同的數(shù)據hash到同一個值的時候,我們要將這些key依次放到hash對應的value中的一個鏈表中。在hash沖突很小的時候,鏈表的訪問速度是沒有問題的。然而,一旦沖突變得很大的時候,我們就需要對鏈表進行改造了,讓鏈表變成一個紅黑樹,進一步減少訪問沖突的key值的數(shù)據。
問題2: hash的一致性問題?
1.背景介紹:
對于hash來說,另外一個必須要要解決的問題,就是hash的一致性問題了,它所處于的場景常常發(fā)生在我們對hash所對應的服務器進行擴容或者縮減的時候,舉個例子:服務器不夠用,我們添加新的服務器的時候,或者服務器平白無辜掛掉了的時候。在這種情況下,我們又希望hash之后的key盡量少的影響數(shù)據的hash指向的服務器,于是便有了hash一致性算法。
2.解決方案:
hash一致性算法大體的意思就是:針對一個很大的數(shù)值uint32做hash,從0~2^32-1構成一個環(huán),首先,通過hash算法將服務器的IP或者域名計算一個數(shù)值,分布在這一個環(huán)上面;然后,對于數(shù)據key采用同樣的hash算法,將value也分布到這個這個環(huán)上面,按照順時針的順序找到下一個服務器,將數(shù)據的放到這個服務器上面。
服務器數(shù)量太少導致的負載不均衡的情況:
上面的算法在服務器數(shù)量很大的時候,是沒有問題的,數(shù)據會均勻分布到這些服務器上面。可是,如果服務器數(shù)量很少的時候,就會出現(xiàn)數(shù)據落到不同服務器上面的數(shù)據不均衡的現(xiàn)象。
為了解決這個問題,hash一致性又引入了虛擬服務器的含義,思路如下:首先將同一個服務器計算多次hash值,這樣以來這些大量的虛擬服務器會落在環(huán)上面,這個情況下的服務器分布就會均勻很多,如此以來數(shù)據的hash值就會被分配到虛擬的服務器上面,而虛擬服務器最終會指向真實的服務器。
筆者覺得,這種操作是利用了添加映射層的方式,類似于將hash值對應一個適配的數(shù)據層,在將數(shù)據層對應真實的數(shù)據。
問題3: hash中的長尾效應,如何處理?
1.背景介紹:
在開始之前,筆者來講下長尾效應:對于一個消息,在被一個消費者拿走了之后,如果需要處理很長時間,才能結束,那么筆者稱這個消息的任務是一個長尾任務。長尾任務在通過hash之后,往往會導致有一部分服務器上面的任務都是短任務,一部分服務器上的任務長尾任務很多,結果就是有些服務器會很忙。筆者將這種情況描述為長尾效應。
對于長尾效應,筆者覺得根本原因在于消費者處理不同任務的時間有快有慢導致,也就是說我們只要在hash的時候能夠識別出來那些服務器處理時間久就好了,讓那些處理比較慢的服務器分配少一點的任務數(shù)量。
2.解決辦法:
基于上面的思路,筆者想到了消息響應機制,也就是說hash的時候,對服務器對應的數(shù)據增加一個flag,讓它來記錄分配出去的key值數(shù)據有沒有被服務器處理完畢。服務器端在收到消息的任務之后,不立馬回復ack消息,等到處理完了之后,再回復ack消息,如此一來,收到ack的hash記錄會把服務器的flag設置成true。如此以來,hash之后的數(shù)據,不會直接發(fā)給沒處理完的服務器。
原理類似rabbitmq里面對消費者處理的ack響應處理的思路,不過如此一來,再進行hash的時候,需要根據ack的響應這個可能會導致提供hash服務的進程存在消息堆積的問題。
不過這個問題也是合理的,因為就算快速的消息丟給了消費者,在消費者很慢的時候,消息只是堆積在了消費者而已。當然,我們也可以模擬rabbitmq的方式,增加qos的數(shù)量設置,讓消費者一次性消費多個消息,如此就會緩解消息堆積在hash的那個服務上面了。
到此,關于“rabbitmq Hash沖突和一致性相關問題舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網站題目:rabbitmqHash沖突和一致性相關問題舉例分析
轉載注明:http://www.ef60e0e.cn/article/jejhog.html