分布式缓存服务 DCS-使用DCS实现热点资源顺序访问:方案概述
方案概述
应用场景
在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或synchronized)进行互斥控制。这种Java提供的原生锁机制可以保证在同一个Java虚拟机进程内的多个线程同步执行,避免出现无序现象。
但在互联网场景,例如在商品秒杀过程中,随着客户业务量上升,整个系统并发飙升,需要多台机器并发运行。例如当两个用户同时发起的请求分别落在两个不同的机器上时,虽然这两个请求可以同时执行,但是因为两个机器运行在两个不同的Java虚拟机中,因此每个机器加的锁不是同一个锁,而不同的锁只对属于自己Java虚拟机中的线程有效,对其他Java虚拟机的线程无效。此时,Java提供的原生锁机制在多机部署场景下就会失效,出现库存超卖的现象。
解决方案
基于上述场景,需要保证两台机器加的锁是同一个锁,用加锁的方式对某种资源进行顺序访问控制。这就需要分布式锁登场了。
分布式锁的思路是:在整个系统提供一个全局的、唯一的分配锁的“东西”,当每个系统需要加锁时,都向其获取一把锁,使不同的系统获取到的内容可以认为是同一把锁。
当前分布式加锁主要有三种方式:(磁盘)数据库、缓存数据库、Zookeeper。
使用D CS 服务中Redis缓存实例实现分布式加锁,有几大优势:
- 加锁操作简单,使用SET、GET、DEL等几条简单命令即可实现锁的获取和释放。
- 性能优越,缓存数据的读写优于磁盘数据库与Zookeeper。
- 可靠性强,DCS有主备和集群实例类型,避免单点故障。
对分布式应用加锁,能够避免出现库存超卖及无序访问等现象。本实践介绍如何使用Redis对分布式应用加锁。