基于zookeeper分布式锁

coding

    最近项目中新上线了抢优惠券功能,虽然用户不多但是,如何防止超发呢?单体应用情况下只需要在抢券方法前用synchronized修饰即可,但是目前大部分项目都是分布式微服务架构,所以就需要加分布式锁。项目用的SpringMVC+dubbo,注册中心使用的zookeeper,所以就选用的基于zookeeper的分布式锁。

原生的zookeeper分布式锁写起来比较复杂,使用zookeeper的Curator框架轻松实现,代码实现:

pom文件

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.6</version>

</dependency>

<dependency>

<groupId>org.apache.curator</groupId>

<artifactId>curator-recipes</artifactId>

<version>4.0.1</version>

</dependency>

Spring集成

<!-- 重连策略 -->

<bean id="retryPolicy" class="org.apache.curator.retry.ExponentialBackoffRetry">

<!-- 间隔时间基数 -->

<constructor-arg index="0" value="1000" />

<!-- 重连策略 -->

<constructor-arg index="1" value="3" />

</bean>

<bean id="curatorFramework" class="org.apache.curator.framework.CuratorFrameworkFactory" factory-method="newClient" init-method="start">

<constructor-arg index="0" value="#{globalConfig.zk_address}" />

<!-- sessionTimeoutMs会话超时时间,单位为毫秒。默认是60000ms -->

<constructor-arg index="1" value="5000" />

<!-- connectionTimeoutMs连接创建超时时间,单位毫秒,默认15000ms -->

<constructor-arg index="2" value="3000" />

<constructor-arg index="3" ref="retryPolicy" />

</bean>

@Autowired    

private CuratorFramework curatorFramework;

//定义锁路径

String path = "/lock/discount/" + discountId;        

InterProcessMutex lock = new InterProcessMutex(curatorFramework, path);

//获取锁 

if (lock.acquire(3000, TimeUnit.MILLISECONDS)) {

//do something

}

//释放锁

lock.release();

分布式锁配合事务使用时,不要加到事务方法上,在外层调用者上加锁,否则存在事务未提交即获取锁;

以上是 基于zookeeper分布式锁 的全部内容, 来源链接: utcz.com/z/510234.html

回到顶部