分布式系统中如何实现临界资源的互斥访问效率,分布式系统中如何实现临界资源的互斥访问模式
在临界多道程序系统中有许多进程,它们共享各种资源,但许多资源一次只能被一个进程使用。一次只有一个进程可以使用的资源称为关键资源。
如上所述,在抢购中提交商品订单,在微信中开多人红包,都属于这种关键性的资源访问,一次只允许一个进程使用。
临界互斥访问分布式互斥随着分布式系统的出现而出现,并随着分布式系统理论的发展而发展。在分布式系统中,许多进程可以在微观层面上并行执行。然而,由于共享资源的限制和全局数据需求的一致性,对一些关键资源的访问需要以互斥的方式同步。
在传统单机部署的情况下,Java原生锁可以通过使用Java并发相关的API(比如ReentrantLock或synchronized)进行互斥控制。Java提供的这种原生锁定机制可以保证同一个Java虚拟机进程中的多个线程同步执行,从而避免无序。
但在互联网场景下,尤其是抢购活动中,随着整个系统并发访问量的飙升,需要多台机器并发运行来应对用户的井喷式访问。假设多个用户的请求同时到达,但是它们落在不同的机器上。虽然这两个请求可以同时执行,但是由于两台机器运行在两个不同的Java虚拟机上,所以它们添加的锁只对属于自己Java虚拟机的线程有效,对其他Java虚拟机的线程无效。因此,Java提供的原生锁机制在多机部署场景中失效。这是因为两台机器添加的锁不是同一个锁(两个锁在不同的Java虚拟机中),会导致积压的现象。
分布式锁是基于现有的情况。我们只需要保证多台机器添加的锁是同一个锁,用加锁的方法控制对某些资源的顺序访问。这需要分布式锁的出现。
分布式锁是一种解决分布式关键资源并发读写的技术。锁定分布式应用可以避免库存超卖和无序访问的现象。
分布式锁的思想是在整个系统中提供一个全局的、唯一的获取锁的“东西”,然后每个系统在需要加锁的时候请求这个“东西”获取一个锁,这样不同系统获取的东西就可以看作是同一个锁。
目前,分布式锁定主要有三种方式:(磁盘)数据库、缓存数据库和Zookeeper。
使用Redis实现分布式锁使用Redis类型的缓存实例来实现分布式锁有几个优点:
锁定操作很简单,使用SET、GET、DEL等几个简单的命令就可以获取和释放锁。
性能优异,比磁盘数据库和Zookeeper更好的缓存数据读写。
如下图所示,可以使用redis的set方法锁定关键资源,点击获取全额。
使用redis的del方法释放锁。
与传统的redis相比,如今各大云厂商也推出了redis云服务,以即用、安全、可靠、扩展灵活、管理方便等特点受到软件开发企业和开发者的欢迎。
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。