千萬不要給女朋友解釋 什麼是 “羊群效應”
阿新 • • 發佈:2020-12-25
> 千萬別給自己女朋友以任何方式講技術,問就是不知道,長壽祕訣~
媳婦最近突然愛學習了,各種刷演算法、架構方面的題,沒日沒夜的帶娃還有這個勁頭,著實讓我沒想到。看似一片欣欣向榮,不過,長期的生存經驗告訴我,這並不是什麼好事,事出反常必有妖~
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201223151242737.jpg?)
一個測試人員不變著花樣找 bug,開始研究程式碼想製造 bug了,彎轉的有點急啊,不過,不管怎麼樣渴望學習是好事。我這點水平忽悠她,那還不跟欺負小學生一樣。
那天突然問我:" 什麼是 `zookeeper` 的羊群效應?",我有點驚訝,問的挺深入,看來這次是認真學了啊。那得趕緊講不能打消人家的學習積極性。
其實這是個挺簡單的概念,羊群效應常在`zookeeper`實現分散式鎖的場景中發生,建議沒接觸過`ZK`的同學先補習下基礎知識[《一文徹底搞懂 zookeeper 核心知識點》](https://mp.weixin.qq.com/s?__biz=MzAxNTM4NzAyNg==&mid=2247490451&idx=1&sn=909a35faf9b7a45fd7f5fcabd7cea828&chksm=9b858b6eacf20278c25c35fdf66a2f88149489beb54c054dcf8d556abf82946119f84751503d&token=1698265432&lang=zh_CN#rd),分析一下`zookeeper`實現分散式鎖的原理就更容易理解了,看下圖:
![普通分散式鎖](https://img-blog.csdnimg.cn/20201223151756919.png?)
利用`zookeeper`獨特的類似檔案系統的資料結構,可以像建立資料夾一樣隨意建立節點`my_lock`,節點下可以建立子節點,節點還可以儲存資料並生成有序自增的節點ID `my_lock_00000001 .... my_lock_0000000N`等。這樣先建立的節點序號ID 就越小,誰的節點ID 最小則視為拿到鎖,拿到鎖的節點處理完業務後刪除對應節點釋放鎖。
而沒拿到鎖的執行緒通過設定`watcher`監控節點`my_lock`,一旦發現該節點下有執行緒釋放鎖刪除子節點,其餘 **所有執行緒** 重新獲取`my_lock`下 **全部子節點** 比較自身節點是否為最小,最小則獲得鎖,一直如此重複,直到所有執行緒都拿到鎖。
那這樣就產生一個現象,在整個分散式鎖的競爭過程中,存在大量重複執行的動作,並且絕大多數都是無效操作,判斷出自己並非是序號最小的節點,從而繼續等待下一次通知,這就是所謂的 “`羊群效應`”。
如果節點數量足夠多,當刪除一個節點大量客戶端同時監聽,比較自己自身節點是否為最小,就會產生大量的網路開銷,會大大降低整個`zookeeper`叢集的效能,所以必須對現有的分散式鎖進行優化,如下圖:
![優化後的分散式鎖](https://img-blog.csdnimg.cn/20201223161710641.png?)
既然只想判斷自身是不是最小的節點,那麼每次比較的時候,比如 `my_lock_00000002` 發現自己不是最小節點後,這時只要找到前一個節點`my_lock_00000001` 並`watcher` 監控它。當`my_lock_00000001` 釋放鎖刪除節點,則會通知節點`my_lock_00000002`該你拿鎖了,其他節點以此類推,這樣有序監聽就解決了“`羊群效應`”。
![](https://img-blog.csdnimg.cn/20201223165636774.jpg#pic_center)
**吧啦吧啦半天,給我自己都講嗨了,我問人家懂了嘛,她來一句:懂了一丟丟,要不你再講一遍?**
對於這種顏值高過智商的選手,我決定換一種講解思路,用一個故事打動她~
咳~ 咳~ 咳~ 開始了
### 學以致用
未來的某一天,富仔(`ZK`)睜眼突然發現自己穿越到了大學時代,躺在某師範學院的宿舍床上,臉竟然還被換成了吳某凡的。這讓原本貧瘠的顏值一下子達到巔峰,再也不用因為是班裡唯一的男生,但又沒女生喜歡而自卑了。
帥歸帥課還是要上的,不巧這天上課遲到了,富仔剛推開階梯教室的大門,突然有個美女尖叫著大喊:“看,富仔今天好帥!”,頓時屋內一陣騷亂,大家左顧右盼,面面相覷。
![羊群,咩,咩,咩](https://img-blog.csdnimg.cn/20201215164435416.jpg)
突然,眾美女們一窩蜂的向他撲過來,這時有個叫楊某冪(`執行緒1`)的美女眼疾手快,一把抓住他的手,問能不能陪她去操場溜達一圈(`處理業務`),富仔這人心軟,一看她楚楚可憐的樣子就答應了,楊某冪立馬拉著他的手飛奔向操場。其他的美女略顯失落的回到座位。
十分鐘後,做完該做的,富仔還是心心念念著學業,執意堅持去上課,回到教室門口鬆開楊某冪的手,準備走向自己的座位。
此時眾美女們又一擁而上,這回是一個叫唐某嫣(`執行緒2`)的美女得手了,問富仔是不是也能陪她溜達一圈,富仔看她不是那麼好看,委婉的拒絕了(`不是最小`)。
後邊的鄭某爽(`執行緒3`)一把推開唐某嫣抓住富仔的手,問能不能陪她,富仔看著這妹子顏值不錯,果斷答應了~
這樣幾次以後導員(`ZK叢集服務`)看不下去了,嚴厲的與富仔交涉,雖然你的容貌驚為天人,但是你不能影響課堂紀律,同學們天天在教室練百米衝刺可不行,沒法專心學習了。
富仔一想覺得非常有道理,告訴妹子們不用天天盯著自己了,還是要專心學習。
於是為全班妹子放了號,排了值日表,誰拿的號越靠前誰優先得到富仔溜達權,後邊的人只要盯住(`watcher`)拿她前一個號的那個人就行,前邊的人溜達完,後邊的趕緊跟上,就這樣富仔開始了沒羞沒臊的大學時光。
![](https://img-blog.csdnimg.cn/20201215193822100.jpg?)
我:這回懂了嗎?
**啪~** 一個大巴掌落我腦袋上了
暴躁女友:你們在操場幹什麼了?
我:......
暴躁女友:你是不是早就有這想法了,想當皇帝是嘛,啊!?
我:......
**以上故事純屬虛構,如有雷同算你牛批**
整理了幾百本各類技術電子書,送給小夥伴們。關注公號回覆【**666**】自行領取。和一些小夥伴們建了一個技術交流群,一起探討技術、分享技術資料,旨在共同學習進步,如果感興趣就加入我們吧!
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201128210730424.png?)