Zookeeper分布式锁测试

环境准备:

windows:jdk8+nginx+ab压测

centos7: redis+zookeeper3.3.6

ab下载链接:https://www.apachelounge.com/download/

测试思路:

windows下使用springboot编写秒杀接口,商品数据存在redis,运行三个服务,利用nginx做代理,使用ab分别测试单机锁,自实现zookeeper分布式锁和Curator框架提供的分布式锁区别。

代码如下:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.17.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yc</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>testSecKill</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.4.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

server:
  port: 8081

spring:
  redis:
    host: node1 #centos在windows中的hosts配置映射
    port: 6379
    jedis:
      pool:
        max-active: -1

logging:
  level:
    org.apache.zookeeper: off #关闭日志,可以更好观察控制台打印信息

controller

/**
 * @author wong
 * @date 2021/7/4 9:15
 */
@RestController
public class Controller {

    @Autowired
    private StringRedisTemplate redisTemplate;
//    private ReentrantLock lock=new ReentrantLock();//单机锁
    InterProcessMutex lock = new InterProcessMutex(getZkClient(), "/locks");//框架锁

    @RequestMapping(value = "/secKill",method = RequestMethod.GET)
    public String secKill() throws Exception {
    	  //因为自实现的锁是不可重入锁,所以每个请求到来时都需要单独创建对象建立连接,性能低
//        DistributedLock lock=new DistributedLock("node1:2181");//自实现锁
        try{
        	//lock.lock();
            lock.acquire();
            int num=Integer.parseInt(redisTemplate.opsForValue().get("goods"));
            if(num>0){
                int realNum=num-1;
                redisTemplate.opsForValue().set("goods",realNum+"");
                System.out.println("抢购第"+num+"张票");
                return "抢购成功";
            }else{
                System.out.println("库存不足");
                return "库存不足";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "系统异常";
        } finally {
            lock.release();
            //lock.unlock();
        }
    }

    private static CuratorFramework getZkClient(){
        //重试策略
        ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3);
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("node1:2181")
                .connectionTimeoutMs(2000)
                .sessionTimeoutMs(2000)
                .retryPolicy(policy)
                .build();
        client.start();
        return client;
    }
}

自实现锁在前面的文章中有,此处不贴代码

启动类没有其他配置

运行配置请勾选并行

在这里插入图片描述

nginx

在这里插入图片描述

在这里插入图片描述

ab测试时的接口

ab -n 100 -c 10 http://localhost:9090/secKill

-n代表总请求数

-c代表请求的并发数

然后分别对三个锁进行测试,可以发现单机锁存在超卖问题,自实现分布式锁存在严重的性能问题(建议这里测试时并发度调小,请求数也降低),而框架提供的性能高(每台主机只建立一次连接,并且可重入)。

相关文章

#一、什么是ZooKeeper**ZooKeeper是一个分布式服务协调框架*...
2.ZooKeeper介绍2.1.ZooKeeper由来正式介绍ZooKeeper之前,我...
Zookeeper概述1.ZooKeeper最为主要的使⽤场景,是作为分布式...
环境:1.VMware®Workstation12Pro 2.CentOS7 3.zookeeper...
###1\.面试官:工作中使用过Zookeeper嘛?你知道它是什么...
##2\.ZooKeeper介绍###2.1\.ZooKeeper由来正式介绍Z...