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