关于分布式:什么是分布式锁他解决了什么样的问题

4次阅读

共计 1820 个字符,预计需要花费 5 分钟才能阅读完成。

置信对于敌人们来说,锁这个货色曾经十分相熟了,在说分布式锁之前,咱们来聊聊单体利用时候的本地锁,这个锁很多小伙伴都会用

✔本地锁

咱们在开发单体利用的时候,为了保障多个线程并发拜访公共资源的时候,冀望在同一个工夫只能有一个线程去拜访资源,且在这个线程拜访资源完结之后,其余的线程才能够拜访这块资源

这个时候会应用到 锁机制,个别依据不同的场景会应用到互斥锁,读写锁,自旋锁等等🧐🧐

咱们还晓得 应用锁是会影响效率的

  • 例如如果互斥锁如果拿不到,那么会死等,这很浪费资源

<!—->

  • 自旋锁如果拿不到,则会在原地自旋,一会来问一下,一会又来问一下,效率会受影响

因而还会想方法去实现原子操作,不须要加锁的状况下,保障多个线程同步

这些形式都是属于本地锁,属于在同一个过程内能够应用的锁,目标是可能管制多线程 并发 拜访资源

可随着时代的倒退,单体利用逐步演变成微服务架构的时候,发现应用过程外面的本地锁曾经不实用了,没有方法满足咱们的需要了,因而为了解决多过程并发问题,引入了分布式锁

为什么说没法满足咱们需要呢?

👀举例时刻

例 1

咱们有一个全局变量 sum = 0,此时的应用程序中有两个线程,别离循环 50 次,每一次循环都是对 sum 进行 +1 的操作,咱们晓得,这种状况,咱们须要应用本地锁例如互斥锁对 sum 加锁就能够实现,程序运行结束后,输入的 sum 为 100,这个没有故障

例 2

那么如果此时场景换成有有两个应用程序,别离须要去操作第三方资源中的 sum,还是别离操作 50 次,每操作一次即对 sum 进行 +1 操作

那么这个时候,咱们在每个利用中进行加锁还有意义吗?

并没有意义 因为此处的 第三方资源,并不独自属于任何一个利用过程

就像 例 1 中,sum 全局变量的资源,并不独自属于某一个线程一样,因而,对于例 2,就须要应用分布式锁了

🧐什么是分布式锁?

那么具体分布式锁到底是个啥玩意儿?🧐🧐

他天然他也是锁,只不过是用于 管制多过程之间 并发

他是能够跨微服务,跨 虚拟机 的一种锁机制,上述的本地锁就齐全做不到

那么还是上述的 例 2,咱们就这样应用分布式锁来进行解决

能够看到,应用分布式锁,和应用本地锁,其实思维都是一样的,都是为了控制程序的 并发 拜访资源

都是属于小人锁,作为小人拜访资源之前,先去看看能不能拿到锁,不能坏了规矩,要是坏了这个规矩,那么程序运行就会出问题

只不过本地锁是对应管制同一个过程内的多个线程并发

分布式锁是对于多个过程 并发

✔分布式锁有哪些特点呢?

  1. 互斥

既然是说,最根本的互斥性能,必须得有,不能忘本😉

  1. 锁有超时机制,能够避免死锁

对于分布式锁来说,为了防止异样未被开释,会对所退出一个超时机制

例如过程 A 加锁,然而本人遗记开释锁,或者是因为过程 A 因为异样挂掉,最终导致没有开释锁,这个时候,锁到了超时工夫,主动就会开释

  1. 可重入

一个过程加了锁,这个过程依然是能够再次获取这个锁的,例如对分布式锁一直的续期,一直的设置过期工夫

可是这里如果是对于本地锁,一个线程加了锁,如果再次加锁,那么就死锁了

  1. 能够高性能的取锁和加锁

<!—->

  1. 高可用

从上述咱们能够看到引入的分布式锁,实际上不是过程外部的资源,能够了解为他是一个第三方的资源,是一个中间件

天然应用这些中间件中来实现所的话,个别会应用集群,集群天然会去实现本人的高可用机制,如果某些节点呈现了异样,本身提供进去的机制,内部程序依然能够应用

此处提到的中间件个别都有这些:

  • Redis

<!—->

  • Etcd

<!—->

  • Mysql

<!—->

  • Zookeeper

每一个组件去实现分布式锁的原理和机制是不一样的,然而达到的目标是一样的,都是为了管制多过程并发。

  1. 分布式锁须要是非阻塞的

某个过程如果获取分布式锁,发现拿不到,则会返回 false,这个过程就会去解决本人拿不到锁的逻辑,过程不会因为没有拿到锁而阻塞

🔥总结

那么看到这里,是否答复题目的问题呢?

  • 什么是分布式锁?

他是能够跨微服务,跨 虚拟机 的一种锁机制

  • 分布式锁解决了什么问题?

他解决了在分布式系统中,访问共享资源的问题

感激浏览,欢送交换,点个赞,关注一波 再走吧

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

文中提到的技术点,感兴趣的能够查看这些文章:

  • 我是如何用 redis 分布式锁来解决线上历史业务问题的

<!—->

  • C 语言的 互斥锁、自旋锁、原子操作
正文完
 0