微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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代表请求的并发数

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐