Zookeeper经典应用场景实战

Zookeeper经典应用场景实战

ZK的不足之处

  • watcher检测是一次性的,每次触发之后都需要重新注册
  • 会话超时之后没有实现重连机制
  • 异常处理繁琐
  • 仅提供byte数组类型的接口,没提供java实体序列化级接口
  • 创建节点时如果抛出异常,需要自行检查节点是否存在
  • 无法实现级联删除节点

ZK在分布式命名服务中的实战

分布式API目录

  • 借助于ZK的树形分成结构为分布式系统中各种API接口服务的名称、链接地址,提供类似JNDI(Java命名和目录接口)中的文件系统的功能
  • 在Dubbo中使用ZK维护全局服务接口API的地址列表,大致思路如下
    • 服务提供者启动时,向ZK上的指定节点写入自己的API地址
    • 服务消费者启动时,订阅节点下的服务提供者的URL地址获取所有服务提供者的API

分布式节点命名

  • 常规情况可以采用DB的自增特性、机器的MAC地址、IP进行分布式节点命名维护
  • 使用ZK的持久顺序节点的顺序特性进行分布式节点命名维护,基本流程如下
    • 启动节点服务,连接ZK,检查命名服务根节点是否存在,如果不存在,就创建系统的根节点
    • 在根节点下创建一个临时顺序节点,取回该节点的编号把它作为分布式系统中的节点ID,如果临时节点太多,可以根据需要删除临时顺序节点

分布式ID生成器

  • 在分布式环境下,全局唯一ID系统需要满足全局唯一、高可用
  • 常见实现方案
    • Java的UUID
    • 基于Redis的原子操作incr和incrby生产更全局唯一ID
    • 基于Twitter的雪花算法
      • 4个部分
        • 首位占用1bit,值为0,无实际作用
        • 时间戳占用41bit,精确到ms,可以容纳约69年的时间
        • 工作机器id占用10bit,最多可以容纳1024个节点
        • 序列号占用12bit,这个值在同一ms同一节点上从0开始不断累加,最多可以累加到4095,在工作节点1024个满载情况下,同一毫秒最多可生成1024 * 4095个ID,满足绝大多数并发场景
      • 优点
        • 生成ID不依赖于数据库,完全在内生成,高性能、高可用性
        • 容量大,每秒可以生成几百万个ID
        • ID呈递增,后续插入数据库索引树,性能高
      • 缺点
        • 依赖于系统时钟的一致性,如果出现系统时钟回拨,可能会造成ID冲突或者ID乱序
          • 在启动之前,如果这台机器的系统时间回拨过,那么有可能出现ID重复的危险
    • 基于ZK的顺序节点生成全局唯一ID
    • 基于MongoDB的object_id,每插入一条记录会自动生成全局唯一的一个“_id”字段值,它是一个12字节的字符串,可以作为分布式系统中全局唯一的ID

分布式队列

  • ZK作为一个小文件分布式管理系统,对于吞吐量不高的小型系统可以作为分布式队列使用
    • 设计思路
      • 创建队列根节点: 在ZK中创建一个持久节点,用作队列的根节点,所有队列元素的节点放在这个根下
      • 实现入队: 当需要将一个入队时,可以在队列的根下创建一个临时顺序节点,节点的数据可以包含队列元素的信息
      • 实现出队: 当需要从队列中取出元素时,执行操作
        • 获取根下所有子节点
        • 找到最小序号的节点
        • 获取该节点数据
        • 删除该节点数据
        • 返回节点数据

分布式锁

  • 在单体的应用开发场景中涉及并发同步的时候,往往采用synchronized或lock机制来解决多线程之间的同步问题
  • 在分布式集群工作的开发场景中,就需要分布式锁
基于数据库的分布式锁
  • db操作性能较差,并且有锁表的风险,一般不考虑
  • *可以利用数据库的唯一索引来实现,唯一索引天然具有排他性
  • 问题: 基于数据库实现分布式锁存在什么问题
    • 当遇到数据库宕机时,无法进行及时删除导致死锁问题
      • 无法实现监听机制,当释放锁时无法通知其他线程去获取锁

基于数据库设计分布式锁思路.png

基于Redis的分布式锁
  • 适用于并发量很大、性能要求很高而且可靠性问题可以通过其他方案去弥补的场景
  • 使用setnx命令实现分布式锁,为了避免服务宕机死锁需要加一个过期时间可以使用set …ex …nx
基于ZK的分布式锁
  • 适用于高可用,而并发量不太高的场景
基于ZK非公平锁设计思路

基于Zookeeper非公平锁设计思路.png

  • 多个线程在同一时刻去创建临时节点,只能有一个线程会成功,未创建成功的线程会去监听该节点,该节点一旦被删除,这些等待的线程会继续去竞争
  • 问题: 非公平锁的机制会有什么问题
    • 当竞争激烈的时候,会导致性能下降,出现惊群效应
      • 因为只有一个线程能成功抢到锁,如果在大量线程的情况下,由于这些未抢到锁的线程都会去监听那个锁节点,一旦通知释放之后,都会一起去竞争,导致性能损耗
基于ZK公平锁设计思路

基于Zookeeper公平锁设计思路.png

公平锁兄弟节点监听.png

  • 会先创建一个容器节点,需要持锁的线程会在该容器节点下去创建临时顺序节点,每个子节点都会监听它前面的兄弟节点,当线程删除序号最小的节点释放锁后,后面监听该节点的节点会成为最小序号的节点保证当前线程持锁
  • 问题:为什么公平锁创建的是容器节点来保持临时顺序节点
    • 因为容器节点会定期检查有无子节点,如果没有会删除,可以有效避免手动删除的操作

服务的注册与发现

基于ZK实现注册中心
  • 优点
    • 高可用性: ZK是一个高可用分布式系统,可以通过配置多个服务实例来提供容错能力,如果其中一个实例出现故障,其他实例仍然能继续提供服务
    • 强一致性: ZK保证了数据的强一致性,当一个写操作完成时,所有服务都具有相同的数据视图,所以这样可以确保所有客户端看到的服务状态是一致的
    • 实时性: ZK的watch机制允许客户端监听节点的变化,当服务上线、下线时,客户端会实时收到通知,这样确保服务动态发现
  • 缺点
    • 性能限制: ZK在大量的读写操作或大规模集群下会出现性能瓶颈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/405773.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量形状操作

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序(C/C)_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的,写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发(针对新手小白),VS2017能较为方便的通过SSH编辑…

强大的文本绘图——PlantUML

PlantUML是一款开源工具,它允许用户通过简单的文本描述来创建UML图(统一建模语言图)。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言(DSL)&am…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

【可申请试用】RT-Thread专业版全面支持瑞芯微RK3568系列平台并可实现混合部署...

RT-Thread 专业版是面向任务关键领域的高安全实时操作系统,已被广泛应用于航空航天,电力,轨交,车载,工业控制,新能源,医疗等国家重要领域,是各领域高可靠装备的基础核心软件。该版本…

C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码

1 泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法(Flood Fill Algorithm) ,又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows 自带画图软件的油漆桶功能。 2 源程序 using System; using System.Collecti…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例,也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

【JVM】Java中SPI机制

打破双亲委派模型中提到SPI和JDBC相关内容,那么是如何打破双亲委派模型呢?本文进行一个讲解,在开始讲解之前,我们需要先了解Java中的SPI机制 是什么 SPI 全称Service Provider Interface,是 Java 提供的一套用来被第三方实现或…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息(LCI和LoST) 6.2.11 移…

股票量化系统QTYX“单针探底”迎战A股V型反转|24年2月春节后第一周记录

前言 “实战案例个股画像”系列和大家分享我基于QTYX选股框架,在实战中选股的案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家理解QTYX的精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 关于QTYX初衷和精髓可以查看…

【计算机毕业设计】541鲜花商城系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理,这样会即将不用的命名空间去除,不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法: 1)在普通方法中,this总是指向调用该方法的对象。在普通方法中,它是作为一种隐式参数一直就存在着(这句话的意思,就是其实在普通方法中,编译器一直就…

Word第一课

文章目录 1. 文件格式1.1 如何显示文件扩展名1.2 Word文档格式的演变1.3 常见的Word文档格式 3. 文档属性理解文档属性查看文档属性 4. 显示比例方式一: 手动调整方式二: 自动调整 5. 视图、窗口视图 1. 文件格式 1.1 如何显示文件扩展名 文档格式指的…

Vue2页面转化为Vue3

vue2element-ui转化为Vue3element plus 后台管理系统&#xff1a;增删查改 vue2页面&#xff1a; <template><div class"app-container"><div><el-form:model"queryParams"ref"queryForm"size"small":inline&qu…

【人脸朝向识别与分类预测】基于LVQ神经网络

课题名称&#xff1a;基于LVQ神经网络的人脸朝向识别分类 版本日期&#xff1a;2024-02-20 运行方式&#xff1a;直接运行GRNN0503.m文件 代码获取方式&#xff1a;私信博主或 企鹅号:491052175 模型描述&#xff1a; 采集到一组人脸朝向不同角度时的图像&#xff0c;图像…

刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现

刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组…

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容&#xff0c;后面会将&#xff0c;主要是用来进行追踪的。 4.配置name和email 当然也…

【MySQL系列 04】深入浅出索引

一、索引介绍 提到数据库索引&#xff0c;相信大家都不陌生&#xff0c;在日常工作中会经常接触到。比如某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。 但到底什么是索引&#xff0c;索引又是如何工作的…