zookeeper的羊群效应
什么是羊群效應(yīng)
zk的客戶端可以在znode上添加一個(gè)watch,用來(lái)監(jiān)聽(tīng)znode相關(guān)事件并被通知
羊群效應(yīng)就是 一個(gè)特定的znode 改變的時(shí)候ZooKeper 觸發(fā)了所有watches 的事件。
舉個(gè)例子,如果有1000個(gè)客戶端watch 一個(gè)znode的exists調(diào)用,當(dāng)這個(gè)節(jié)點(diǎn)被創(chuàng)建的時(shí)候,將會(huì)有1000個(gè)通知被發(fā)送。這種由于一個(gè)被watch的znode變化,導(dǎo)致大量的通知需要被發(fā)送,將會(huì)導(dǎo)致在這個(gè)通知期間的其他操作提交的延遲。因此,只要可能,我們都強(qiáng)烈建議不要這么使用watch。僅僅有很少的客戶端同時(shí)去watch一個(gè)znode比較好,理想的情況是只有1個(gè)。
案例分析
舉個(gè)例子,有n 個(gè)clients 需要去拿到一個(gè)全局的lock.
一種簡(jiǎn)單的實(shí)現(xiàn)就是所有的client 去create 一個(gè)/lock znode.如果znode 已經(jīng)存在,只是簡(jiǎn)單的watch 該znode 被刪除。當(dāng)該znode 被刪除的時(shí)候,client收到通知并試圖create /lock。這種策略下,就會(huì)存在上文所說(shuō)的問(wèn)題,每次變化都會(huì)通知所有的客戶端。(羊群效應(yīng))
另外一種策略就是每個(gè)client去創(chuàng)建一個(gè)順序的znode /lock/lock-.ZooKeeper 會(huì)自動(dòng)添加順序號(hào)/lock/lock-xxx.我們可以通過(guò)/lock getChildren 去拿到最小的順序號(hào)。如果client不是最小的序列號(hào),就再比自己小一點(diǎn)的znode上添加watch.
比如我們按照上述邏輯創(chuàng)建了有三個(gè)znodes.
/lock/lock-001,/lock/lock-002,/lock/lock-003.
/lock/lock-001 的這個(gè)客戶端獲得了lock
/lock/lock-002 的客戶端watch /lock/lock-001
/lock/lock-003 的客戶端watch /lock/lock-002
通過(guò)這種方式,每個(gè)節(jié)點(diǎn)只watch 一個(gè)變化
核心邏輯
不需要關(guān)心所有的事件,判斷自己是否是所有節(jié)點(diǎn)中序號(hào)最小的。于是,很容易可以聯(lián)想的到的是,每個(gè)節(jié)點(diǎn)的創(chuàng)建者只需要關(guān)注比自己序號(hào)小的那個(gè)節(jié)點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的zookeeper的羊群效应的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关闭colorbox刷新页面
- 下一篇: 跑马灯广告语的实现过程,并且自定义mar