ZooKeeper入门
思维导图
前言在很多时候,我们都可以在各种框架应用中看到ZooKeeper的身影,比如Kafka中间件,Dubbo框架,Hadoop等等。为什么到处都看到ZooKeeper?
一、什么是ZooKeeperZooKeeper是一个分布式服务协调框架,提供了分布式数据一致性的解决方案,基于ZooKeeper的数据结构,Watcher,选举机制等特点,可以实现数据的发布/订阅,软负载均衡,命名服务,统一配置管理,分布式锁,集群管理等等。
二、为什么使用ZooKeeperZooKeeper能保证:
更新请求顺序进行。来自同一个client的更新请求按其发送顺序依次执行
数据更新原子性。一次数据更新要么成功,要么失败
全局唯一数据视图。client无论连接到哪个server,数据视图都是一致的
实时性。在一定时间范围内,client读到的数据是最新的
三、数据结构ZooKeeper的数据结构和Unix文件系统很类似,总体上可以看做是一棵树,每一个节点称之为一个ZNode,每一个ZNode默认能存储1M的数据。每一个ZNode可通过唯一的路径标识。如下图所示:
创建ZNode时,可以指定以下
从秒杀聊到ZooKeeper分布式锁
思维导图
前言经过《ZooKeeper入门》后,我们学会了ZooKeeper的基本用法。
实际上ZooKeeper的应用是非常广泛的,实现分布式锁只是其中一种。接下来我们就ZooKeeper实现分布式锁解决秒杀超卖问题进行展开。
一、什么是秒杀超卖问题秒杀活动应该都不陌生,不用过多解释。
不难想象,在这种”秒杀”的场景中,实际上会出现多个用户争抢”资源”的情况,也就是多个线程同时并发,这种情况是很容易出现数据不准确,也就是超卖问题。
1.1 项目演示下面使用程序演示,我使用了SpringBoot2.0、Mybatis、Mybatis-Plus、SpringMVC搭建了一个简单的项目,github地址:
https://github.com/yehongzhi/mall
创建一个商品信息表:
CREATE TABLE `tb_commodity_info` (
`id` varchar(32) NOT NULL,
`commodity_name` varchar(512) DEFAULT NULL COMMENT '商品名称',
`commodity_pr