首页 > 其他分享 >【IT老齐058】Zookeeper解决分布式系统商品库存超卖问题

【IT老齐058】Zookeeper解决分布式系统商品库存超卖问题

时间:2024-03-26 15:57:57浏览次数:18  
标签:zookeeper Zookeeper 老齐 顺序 分布式系统 分布式 节点 客户端

【IT老齐058】Zookeeper解决分布式系统商品库存超卖问题

场景

1710998981033

1710999091033

解决方案

  • 传统的synchronized是无效的,它只针对一个JVM进程内多个线程起到同步作用,对跨进程无效。
  • 利用数据库select ... for update 语句对库存进行锁定,依赖数据库自身特性,遇到跨库(分库分表)处理起来比较麻烦。
  • 利用Zookeeper、Redis实现分布式锁特性,通过分布式锁调度进程处理,数据程序级别控制,处理更为灵活。

1710999333423

锁问题

无论是数据库排它锁,还是ZK、Redis的分布式锁都属于“悲观锁”的范畴,虽然以阻塞的方式保证数据的一致性,但并发量也会直线下降,这是要付出的代价。适用分布式锁有以下几个场景:

  • 数据价值大,必须要保证一致性的。例如: 金融业务系统间的转账汇款等。
  • 并发量低但重要的业务系统。比如: 各种大宗商品的分布式交易

总结下:重要的但对并发要求高的系统可以使用分布式锁,对于并发量高、数据价值小、对一致性要求没那么高的系统可以进行最终一致性(BASE)处理,保证并发的前提下通过重试、程序矫正、人工补录的方式进行处理。

Zookeeper

Zookeeper (业界简称zk) 是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而且要达到高吞吐、低延迟同时还要保持一致性和可用性,实际上非常困难。因此zookeeper提供了这些功能,开发者在zookeeper之上构建自己的各种分布式系统。

分布式锁

1710999568062

Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。

1710999623521

节点类型

  • 持久节点 (PERSISTENT)
    • 默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在
  • 持久节点顺序节点 (PERSISTENT SEQUENTIAL)
    • 所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号
  • 临时节点 (EPHEMERAL)
    • 和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除
  • 临时顺序节点 (EPHEMERAL SEQUENTIAL)
    • 顾名思义,临时顺序节点结合和临时节点和顺序节点的特点: 在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后,临时节点会被删除

临时顺序节点的原因

利用临时顺序节点可以避免“惊群效应”,当某一个客户端释放锁以后,其他客户端不会一窝蜂的涌入争抢锁资源,而是按时间顺序一个个来获取锁进行处理。

1710999986373

临时顺序节点的实现原理

每一个客户端在尝试获取锁时都自动由ZK创建该顺序节点的“子节点”,按0001、0002这样的编号标识访问顺序
从第二个客户端开始,ZK不但创建0002子节点,还会监听前一个0001节点。当客户端1处理完毕或者其他原因释放0001节点后,ZK会通过Watch监听机制通知客户端2进行后续处理,以此保证处理的有序性,避免“惊群效应”产生。

1711000258616

实战

安装Zookeeper

 docker run --privileged=true -d --name zookeeper -p 2181:2181
 -v /D/Environment/docker/zookeeper/data:/data
 -v /D/Environment/docker/zookeeper/logs:/datalog
 -d zookeeper:latest

pom

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.6.0</version>
        </dependency>

简易使用

    public int outOfWarehouseWithLock() throws Exception {
        // 客户端重试机制,间隔5秒,共10次
        ExponentialBackoffRetry retry = new ExponentialBackoffRetry(5000, 10);
        // 创建zk客户端,编写配置
        CuratorFramework client =
                CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(retry).build();
        // 开启连接
        client.start();
        // 创建分布式锁,即顺序临时节点
        InterProcessMutex mutex = new InterProcessMutex(client, "/lock/shoe");
        try {
            // 请求锁
            mutex.acquire();
            if (SHOE > 0) {
                Thread.sleep(1000);
                return --SHOE;
            } else {
                throw new UnsupportedOperationException("库存不足");
            }
        } finally {
            // 释放锁
            mutex.release();
        }
    }

标签:zookeeper,Zookeeper,老齐,顺序,分布式系统,分布式,节点,客户端
From: https://www.cnblogs.com/faetbwac/p/18096869

相关文章

  • 【IT老齐061】BASE最终一致性
    【IT老齐061】BASE最终一致性CAP理论下,常用的AP方案的补全手段BasicallyAvailable(基本可用)Softstate(软状态)Eventuallyconsistent(最终一致性)基本可用就是快速实现用户的基本价值与诉求,“创建订单”后立即返回就是基本可用的体现软状态代表业务操作,没有最终完成前的中......
  • 【IT老齐062】缓存一致性
    【IT老齐062】缓存一致性CacheAsidePattern禁止先删缓存,后更新数据库推荐先更新数据库,在删除缓存极端情况延迟双删......
  • 【IT老齐063】秒杀场景下解决商品库存超卖问题
    【IT老齐063】秒杀场景下解决商品库存超卖问题超卖问题核心问题秒杀商品库存总量固定先到先得,瞬间并发极大,但写库量有限解决方案利用预减库存方式杜绝超卖利用Nginx+Lua在网关层面将无效请求阻挡利用MQ消息队列的限流特性保证MySQL不会被瞬间击垮APP需要额外设计......
  • 【IT老齐053】动静分离架构抗住超高并发访问
    【IT老齐053】动静分离架构抗住超高并发访问架构三大分离设计读写分离动静分离前后台分离概念有效区分页面中的动静数据是优化的关键前提静态数据是无个性化数据静态文件:HTML/CSS/JS/图片低频变动数据:字典数据/地区数据/组织架构历史数据动态数据就是个......
  • 【IT老齐054】MongoDB介绍
    【IT老齐054】MongoDB介绍场景特点多形性:同一个集合中可以包含不同字段(类型)的文档对象动态性:线上修改数据模式,修改是应用与数据库均无须下线数据治理:支持使用JSONSchema来规范数据模式。在保证模式灵活动态的前提下,提供数据治理能力速度优势数据库引擎只需要在......
  • 【IT老齐055】Mysql Ngram全文检索技术
    【IT老齐055】MysqlNgram全文检索技术场景select*fromarticlewheretitlelikeJava%可能用到索引,看索引选择性select*fromarticlewheretitledlike%Java一定不会用到索引select*fromarticlewheretitlelike%Java%一定不会用到索引解决......
  • 【IT老齐056】日千万级订单系统的高可用、高性能架构
    【IT老齐056】日千万级订单系统的高可用、高性能架构原始场景避免丢单关键逻辑不要使用读写分离的查询方式,避免从库同步延迟造成订单查询异常关键逻辑也不要使用缓存来进行订单的查询订单补偿不要粗暴地使用消息队列的方式,避免中间件引发的订单丢失接收消息处理......
  • 大数据分布式系统中的脑裂,你懂吗?
        脑裂就是由原来只有一个做决策的大脑突然间变成了由多个同时做决策,而这多个大脑在做决策时,因为互相之间的信息并不同步而导致的决策之间发生冲突进而让分布式系统的管理陷入到一种混乱的局面,分布式系统中引入了多个管理者同时做决策的现象就叫脑裂。    ......
  • Orleans - 1 .NET生态构建分布式系统的利器
    在当今数字化时代,构建高效、可靠的分布式系统是许多企业和开发团队面临的挑战。微软的Orleans框架为解决这些挑战提供了一个强大而简单的解决方案。本文将介绍Orleans的核心概念,并通过一个简单的示例代码来演示其用法。什么是Orleans?Orleans是由微软开发的一个开源分布......
  • 2021-6-8-zookeeper
    概述、Zookeeper设计目的、zookeepr角色介绍、工作原理、应用场景、安装、命令、JAVA操作zookeeper概述它是一个分布式服务框架,是ApacheHadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项......