作者:手机用户2502924641 | 来源:互联网 | 2023-06-21 15:57
在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性
分布式锁的实现思路,跟线程锁的实现原理一样,可以借助memcached或者redis,zookeeper来实现
memcached和redis是一样的都是一块大内存
应用A和B同时向memcached发起查询锁(可以是一个key,value,key自定义比如XXX-orderId,value是true)。
如果存在就说明有人锁上了,稍后再查,如果不存在,自己添加一个锁进去并根据实际情况设置一个超时时间,以防止死锁。得到了锁,就可以干自己该干的事了,干完了,就把锁删除掉,如果出现异常或者,程序挂掉,超时了,锁同样会被删掉防止死锁。
zookeeper实现分布式锁与memcached不同,zookeeper是一个小的文件管理系统,他的原理,是在同一个目录下不可能出现俩个名字一样的文件这样的原理来做的。
第一个请求过来,会在指定目录下生成一个文件,比如:000000000,同样设置超时时间(防止死锁)
第二个请求过来,会在这个目录下,再生成一个文件,名字在之前的基础上 +1,同时监控比他小的那个文件
第三个请求一样的,会在第二个文件的基础上 +1,并监控第二个文件,
当自己发现,自己监控的那个文件,没有了,就或的了锁,就可以干自己改干的事了,干完之后,把自己删除掉。
zookeeper这一特点,可以做注册中心,做分布式锁,还可以做通知,比第三方支付系统发送商户通知,多个应用如果同时向一个商户发通知那不乱套了。
memcached太简单,zookeeper稍后写个例子上传github!