3

分布式系统中如何实现临界资源的互斥访问? - 华为云开发者联盟

 1 year ago
source link: https://www.cnblogs.com/huaweiyun/p/16719334.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
摘要:一次仅允许一个进程使用的资源称为临界资源。

本文分享自华为云社区《分布式系统中如何实现临界资源的互斥访问》,作者:华为云PaaS服务小智。

网络时代,购物、社交等之前只能在线下进行的活动,如今都可以在网络上完成。为了促进消费,电商网、网络店铺经常推出商品限定数量内的“秒杀”,“抢购”活动,类似的临界资源访问还有我们生活中常见的微信多人抢红包。这种临界资源,多人访问的情况,如何保证避免一个资源被多人(一人以上)互斥访问呢?

多道程序系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。

上面我们提到的在抢购中对商品提交订单,微信中打开多人红包都属于这种临界资源的访问,一次只允许一个进程使用。

临界资源互斥访问

分布式互斥是随着分布式系统的出现而出现的,并随着分布式系统理论发展而发展。在分布式系统中,很多进程能够在微观上并行执行。但由于共享资源的有限性,以及全局数据要求的一致性,一些临界资源的访问需要以互斥的方式实现同步。

Java原生锁

在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或synchronized)进行互斥控制。这种Java提供的原生锁机制可以保证在同一个Java虚拟机进程内的多个线程同步执行,避免出现无序现象。

但在互联网场景,特别是抢购活动中,随着整个系统的并发访问飙升,需要多台机器并发运行,以应对用户井喷式访问,假设此时多个用户的请求同时到来,但落在了不同的机器上,虽然这两个请求是可以同时执行,但是因为两个机器运行在两个不同的Java虚拟机里面,他们加的锁只对属于自己Java虚拟机里面的线程有效,对于其他Java虚拟机的线程是无效的。因此,Java提供的原生锁机制在多机部署场景下失效了,这是因为两台机器加的锁不是同一个锁(两个锁在不同的Java虚拟机里面),这样便会出现库存超卖的现象。

基于存在的现状,我们只要保证多台机器加的锁是同一个锁,用加锁的方式对某种资源进行顺序访问控制。这就需要分布式锁登场了。

分布式锁是一种解决分布式临界资源并发读写的一种技术,对分布式应用加锁,能够避免出现库存超卖及无序访问等现象。

v2-87fc24c1d4a24fea8907850fbbf06923_720w.jpg

分布式锁的思路是:在整个系统提供一个全局、唯一的获取锁的“东西”,然后每个系统在需要加锁时,都去问这个“东西”拿到一把锁,这样不同的系统拿到的就可以认为是同一把锁。

当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper。

用 Redis 实现分布式锁

使用Redis类型的缓存实例实现分布式加锁,有几大优势:

• 加锁操作简单,使用SET、GET、DEL等几条简单命令即可实现锁的获取和释放。

• 性能优越,缓存数据的读写优于磁盘数据库与Zookeeper。

如下图中所示,使用redis的set方法即可实现对临界资源加锁,点击此获取全量代码 

v2-7a208c2e51a841b0aa068321530e1ad4_720w.jpg

使用redis的del方法即可实现锁的释放。

v2-4c2d878241e319da249a5c6957ca0f33_720w.jpg

相对于传统redis,如今各大云厂商也都推出了redis云服务,以即开即用、安全可靠、弹性扩容、便捷管理等特点受到软件开发企业和开发者的欢迎。

李美安. 普适分布式互斥算法及应用[D]. 电子科技大学, 2006.

点击关注,第一时间了解华为云新鲜技术~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK