转载本文请联系程序员内店师公众号。我媳妇最近突然爱上了学习。没想到她这么有动力去解决各种算法和架构问题,没日没夜地带娃。好像很欣欣向荣。然而,长期的生活经验告诉我,这并不是什么好事。出问题了,肯定有怪物~一个测试人员不停的找bug,开始研究代码出bug。他有点着急啊,不过好歹好学。以我这个水平糊弄她,跟欺负小学生不一样。那天突然问我:什么是动物园管理员的羊群效应?那你得赶紧说,你打消不了人家的学习热情。其实这是一个很简单的概念。羊群效应经常出现在zookeeper实现分布式锁的场景中。建议没有接触过ZK的同学先学习基础知识。更容易理解zookeeper实现分布式锁的原理,见下图:普通的分布式锁使用zookeeper独特的类似文件系统的数据结构,可以像创建文件夹一样随意创建节点my_lock,在节点下创建子节点,节点也可以存储数据并生成有序的自增节点IDmy_lock_00000001....my_lock_0000000N等。这样,先创建的节点ID较小,节点ID最小者视为获得锁,获得锁的节点删除对应节点处理完业务后释放锁。没有拿到锁的线程通过设置watcher来监听节点my_lock。一旦发现该节点下有线程释放锁删除子节点,所有其他线程重新获取my_lock下的所有子节点,比较自己的节点是否最小。重复此操作,直到所有线程都获得了锁。那么有一个现象就是在整个分布式锁竞争过程中,有大量的重复动作,而且大部分都是无效操作。判断自己不是序号最小的节点,所以继续等待下一次通知。这就是所谓的“羊群效应”。如果节点数量足够大,当一个节点被删除,大量客户端同时监听,比较自己的节点是否最小,会产生大量的网络开销,会大大降低整个zookeeper集群的性能,所以现有的分布式锁必须是Optimize的,如下图:由于优化后的分布式锁只想判断自己是否是最小节点,那么每次比较时,比如经过my_lock_00000002发现自己不是最小节点,只需要找到之前的节点my_lock_00000001,用watcherit监控即可。当my_lock_00000001释放锁删除节点时,会通知节点my_lock_00000002你该拿锁了,其他节点也会以此类推,所以有序的监控会解决“羊群效应”。好吧好吧,我跟自己打招呼很久了。我问我听懂了吗,她说:我听懂了一点,你再解释一遍好吗?对于这种颜值比智商还高的选手,我决定换一种解释方式,用故事打动她~咳~咳~咳~以后有朝一日我开始学以致用了,福仔(ZK)睁开眼,忽然发现自己穿越回了大学时代,躺在某师范学院的床上。宿舍的床上,那张脸换成了吴某凡的。这一下子把原本贫瘠的模样发挥到了极致,他也不再因为班里只有他一个男生却没有女生喜欢他而自卑。帅还有课,可惜那天他上课迟到了。福在刚推开讲堂的门,突然一个美女尖叫起来:“看,福在今天好帅啊!”一阵骚动,众人左顾右盼,面面相觑。蜂拥而至,咩咩,咩咩,顿时,众美女纷纷涌向他。这时,一位名叫杨某米(线程1)的美女拉住了他的手,问他能不能陪她去游乐场。一圈(处理公务),福仔心软,见她可爱又可怜的模样,就答应了。杨某米立即拉着他的手,往操场跑去。其他几位美女有些失望的回到了自己的座位上。十分钟后,做完该做的事,付仔还在想着自己的学业,坚持要去上课,回到教室门口松开杨某米的手,准备往自己的座位走去。这时候,所有的美女又都冲了上来,这一次是一个叫唐某言(线程2)的美女得手了,问福在能不能陪她出去走走,福在看她不是这样的好看,所以他婉言拒绝了(不是最小的)。郑某双(线程3)推开唐某言,拉住付在的手,问他能不能陪她。福仔看妹子长得好看,就果断答应了~这样搞了几次后,导游(ZK集群服务)看不下去了,和福仔严厉交涉,虽然你的颜值很赞,但是你不能影响课堂纪律,学生天天在课堂上练习百米短跑对学习不好,也不能专心学习。福仔想了想,觉得有道理,叮嘱姑娘们不要天天盯着他看,要专心学习。所以我给全班女生分配了编号,并做了一份任务清单。谁先拿到号码,谁就有权先绕着福仔走一圈。后面的人只要看着拿了她之前号码的人就行了。第一个人逛完之后,后面的人也赶紧跟了上去,就这样,福仔开始了他不要脸的大学时代。我:这次你明白了吗?啪~一个大耳光落在了我的头上脾气暴躁的女朋友:你在操场上干什么?是皇帝啊!?我:…
