随着业务的发展,需要一个应用部署到多个机器做负载均衡,为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,控制并发,就需要使用分布式锁控制做个资源的访问。
1、分布式锁应该具备哪些条件
1)在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
2)高可用的获取锁与释放锁;
3)高性能的获取锁与释放锁;
4)具备可重入特性;
5)具备锁失效机制,防止死锁;
6)具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。
2、分布式锁实现方式
1)基于数据库实现分布式锁:创建唯一索引
2)基于缓存(Redis等)实现分布式锁:释放锁使用expire(设置超时时间),delete key
3)在Zookeeper当中创建一个持久节点ParentLock,当第一个客户端想要获得锁时,需要在ParentLock这个节点下面创建一个临时顺序节点 。Client查找ParentLock下面所有的临时顺序节点并根据创建时间排序,如果是顺序最靠前的一个的第一个节点,则成功获得锁。如果不是,则向排序仅比它靠前的节点Lock注册Watcher,用于监听Lock节点是否存在,此时此节点处与等待状态。
优点:具备高可用、可重入、阻塞锁特性,可解决失效死锁问题。
缺点:因为需要频繁的创建和删除节点,性能上不如Redis方式。