一.什么是惊群效应
举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。对于操作系统来说,多个进程/线程在等待同一资源是,也会产生类似的效果,其结果就是每当资源可用,所有的进程/线程都来竞争资源。
二.惊群效应的危害
- 巨大服务器性能消耗
- 可能发生宕机
- 巨大的网络冲击
三.分布式锁实现方式
数据库写入log实现分布式锁
缺点:1.若当前线程挂掉容易出现死锁
2.容易出现单点故障
redis实现分布式锁
缺点 :容易出现短期死锁,当前线程挂掉,但是由于redis的过期机制,所以可能多时间内死锁
zookeeper实现分布式锁
总结:相对来说zookeeper 更适合实现分布式锁,实现相对简单,可靠性相对比较高,性能比较好。
四.分布式锁惊群效应产生的场景
描述:多个线程未获取到锁,处于阻塞等待状态,等获取到锁的线程释放锁,所有处于阻塞状态的线程去争抢资源获取锁,导致产生惊群效应。
五.惊群效应解决方案
采用医院看病取号排队的原理,采用zookeeper的临时顺序节点,先创建子节点,获取所有子节点列表,判断当前节点是否是最小节点,如果是最小节点占用锁执行后续代码,执行完毕,释放锁。如果不是最小节点观察比自己小一个节点,等待锁,比自己小一个的节点被删除,得到通知,当前线程取获取锁,有效的避免了惊群效应。