揭秘井井有条的流水线(ZooKeeper 原理篇)
本文作者:HelloGitHub-老荀
Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源、有趣、入门级的 ZooKeeper 教程,面向有编程基础的新手。
本系列教程是从零开始讲解 ZooKeeper,内容从最基础的安装使用到背后原理和源码的讲解,整个系列希望通过有趣文字、诙谐的气氛中让 ZK 的知识“钻”进你聪明的大脑。本教程是开放式:开源、协作,所以不管你是新手还是老司机,我们都希望你可以加入到本教程的贡献中,一起让这个教程变得更好:
新手:参与修改文中的错字、病句、拼写、排版等问题
使用者:参与到内容的讨论和问题解答、帮助其他人的事情
老司机:参与到文章的编写中,让你的名字出现在作者一栏
项目地址:https://github.com/HelloGitHub-Team/HelloZooKeeper
从今天这篇开始,开始进入 ZK 的原理讲解了,我会尽量把背后的原理比喻的有趣点的,大家放心看下去吧!今天讲的是单机版业务处理流程。
一、办事处的新同事
老规矩~我们继续来看看动物村又发生了什么事情吧?
1.1 马果果要做老板啦
马果果毕竟年纪大了,每天接待这么多村民,实在是吃不消了,最终决定向村委会申请下能不能多招几个人,让他也能过过当老板的瘾。村委会考虑再三最终还是同意了,并且决定由马果果自己去邻里街坊找合适的人拉来工作。马果果一直非常注重体育锻炼,所以三天两头泡在健身房里,于是开始在健身房里物色人选,最终选了三个身强体壮的年轻小伙,并且连昵称都给他们起好了,一个 80 多公斤叫小P,一个 90 多公斤叫小S,最后一个 200 斤叫小F!
招人完成后,把办公室的布置也换下,变成了这样:
马果果现在高枕无忧在后方当管理者了,前面的工作都交接给了三个小伙,三个小伙各自工作也比较简单,我们一个个来看吧
1.2 细心的小P
作为办事处第一个被村民接触到的员工,小P先会对要来处理事务的村民进行检查并做一些简单的询问:
这里必须得提下,如果出现了异常错误,小P不会终止对该村民的服务,也会继续引导他至小S的柜台继续办理
1.3 认真的小S
小S的工作也非常简单,我们直接来看下流程图:
小S是办事处的记录员,一直手边备着一本备忘录:
这本备忘录不需要去管是谁来登记的只需要把登记具体的内容(甚至是小P标记的异常)给记录下来就行,之后每过一段时间统一进行归档。
1.4 能干的小F
小F作为曾经的大力士和马果果是有切磋过的,并且以微弱的优势输给了马果果,但是大度的小F并没有把这些陈年旧事放在心中,仍然心甘情愿的来马果果手下帮忙,真是一位受人尊敬的好同志啊!
小S这边每次归档完就会把那些事务一起交给小F,而作为办事处坐在最后一位的业务员,小F手中握有马果果交给他的两个核心文件:小红本和小黄本!
需要把村民的请求认认真真的记录在小红本上,同时还需要查看是否有需要通知的村民在小黄本上,代替马果果对他们进行电话通知。
看起来小F做的事很少,但是实际是最多的,只是我这里把小红本和小黄本的逻辑给简单化了,小红本和小黄本我之后单独开篇讲解,这样又能水一期。
二、井井有条的背后
小故事讲完了,下面用猿话进行翻译:
我起名的时候为了加深大家的印象才用了这三个名字:
小P对应代码中的
PrepRequestProcessor
小S对应代码中的
SyncRequestProcessor
小F对应代码中的
FinalRequestProcessor
在服务端启动的时候,就会把这三个处理器按照 P -> S -> F 的顺序串成一个链条,并且 P 和 S 本身就是一个线程对象,两者会随着服务端的启动而启动。
而 P 和 S 启动后各自都会使用一个死循环来处理主要的逻辑,而这部分 ZK 又会使用一个非常经典的模式来处理:生产者和消费者模式!他们各自都维护了一个阻塞队列,将接收请求和处理请求的逻辑拆开,从这个设计上就提升了吞吐量和性能。
其实不光光是这里,在 ZK 中这个模式可谓是随处可见,之后有遇到的时候会再说,我们现在把三个处理器的处理逻辑再深挖一下。
2.1 PrepRequestProcessor
从流程上可以看到,PrepRequestProcessor 不涉及内存的操作和文件的操作,作为第一个处理器主要负责做些校验和标记的任务。
2.2 SyncRequestProcessor
这里需要额外的提一下,流程中的两个粉红色的框,分别对是否快照和是否归档进行了判断:
是否快照:事务记录的数量或者大小大于了某一个程度,而这个程度的数字则是一个随机数(每次快照完都会重置)
是否归档:上次归档的时间和当前时间是否超过了配置的间隔时间(默认该配置为 0),或者事务的记录超过了配置的数量(默认为 1000)
使用了这两个判断控制了快照和归档的频率:
频率低的话,一次写入更多数据到磁盘,性能更好,但是容灾能力就低
频率高的话,对性能会有一定影响,但是容灾能力强
2.3 FinalRequestProcessor
好像这张图和上面那张图其实没什么区别(Orz),就是因为细节都在小红本和小黄本中,所以留到下一章展开。
为什么小P那边的异常不直接返回给客户端,而要向后传递至小F再响应?我想可能是为了能统一每个处理器的职责,客户端的响应都是小F来处理的。
在这里我小小的剧透下,以上的场景实际是 ZK 单机版的处理场景,如果换成了集群版会在该链条中加入更多的处理器,之后会涉及到集群后再讲。
三、总结
本章节介绍了单机版的 ZK 处理客户端请求的流程,并且通过责任链的方式把不同的逻辑拆分到不同的对象中去处理。下一章我们会正式进入内存模型和通知机制的实现,一起来看看马果果手中的两大核心账本到底是怎么记录的吧~
由于本章开始进入了 ZK 的原理讲解,一篇文章以及我个人很难做到面面俱到,所以如果你有任何对文章中的疑问也可以是建议或者是对 ZK 原理部分的疑问,可以来我创建的话题中来讨论,方便记录和答疑:
地址:https://www.yuque.com/kaixin1002/yla8hz
我会为每一篇文章建立一个话题,这样你就可以在其中讨论,把你的问题困惑描述清楚。
答应我从今天起 ZKr 起来,好吗~
关注公众号第一时间收到推送
▼ 点击 阅读原文 点个 Star 吧
揭秘井井有条的流水线(ZooKeeper 原理篇)相关推荐
- 动物园的铲屎官Zookeeper——原理篇
目录 前言 一.Zookeeper是什么 二.Zookeeper集群特点 三.Zookeeper的数据结构 1. Znode类型 2. stat结构体 三.Zookeeper内部原理 1. 监听器原理 ...
- 格式化zookeeper命令_zookeeper原理篇Zookeeper的数据存储与恢复原理
前言 经过前面的一些文章的学习和了解,我们对Zookeeper有了一定的理解. 前文直达链接: zookeeper原理篇-Zookeeper选举过程分析 zookeeper原理篇-Zookeeper会 ...
- 业界大佬揭秘美颜技术的算法原理
业界大佬揭秘美颜技术的算法原理 美颜技术发展现状和应用场景 1. 人脸检测 2. 人脸关键点 3. 瘦脸 4. 磨皮 5. 美白 微信公众号同步 美颜技术发展现状和应用场景 随着视频类APP的流行 ...
- ZooKeeper实战篇之zk集群搭建、zkCli.sh操作、权限控制ACL、ZooKeeper JavaAPI使用
在看了史上最全的Zookeeper原理详解(万字长文),了解Zookeeper的原理后,你是不是蠢蠢欲动想着手实践呢?这篇文章将手把手教你在Linux上搭建ZooKeeper集群,并调用相关API实现 ...
- 面试大厂不看这两份Java面试核心知识点原理篇+框架篇,有个屁用?食屎啦泥?
前言 面试在即,Java知识点很凌乱? 别急,有本套书在呢! 除了原理,还有框架! ★ 精细讲解JVM原理.Java基础.并发编程.数据结构和算法.网络与负载均衡 ★ 深入挖掘数据库与分布式事务.分布 ...
- zookeeper原理及应用
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...
- ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用
ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用 - 文章 - 伯乐在线 /* # The number of milliseconds of each tick tickTim ...
- 《CDN 之我见》系列二:原理篇(缓存、安全)
2019独角兽企业重金招聘Python工程师标准>>> <CDN之我见>共由三个篇章组成,分为原理篇.详解篇和陨坑篇.本篇章适合那些从未接触过.或仅了解一些 CDN 专业 ...
- 检查压缩包是否损坏_修复损坏的gzip压缩文件之原理篇
接修复损坏的gzip压缩文件之原理篇,再次引用GZIP结构图: 已知修复一个损坏的gzip文件的关键环节在于找到下一个正常压缩包的起始点.根据结构图中的信息可知,每个压缩包的开始结构中有是否到达尾部标 ...
- Tomcat 原理篇
TOMCAT 原理篇 一.Tomcat 组成(Tomcat 由以下组件组成) 1.server a) Server是一个Catalina Servlet容器: b) Server 可以包含一个或多个s ...
最新文章
- java反射最佳实践,java反射性能测试分析
- JavaScript的主要功能
- iOS开发网络篇—搭建本地服务器(待整理)
- 字符集:ASCII、GB2312、GBK、GB18030、Unicode
- android菜单点击功能怎么做的,单击android中的Menu按钮打开上下文菜单
- C++ 数组在内存中的分配
- java中什么是守护线程_什么是Java的守护线程?
- php create database,sql create database 创建数据库命令
- oracle脚本审核平台,Oracle 脚本(适应各种业务需要)
- SAP License:家庭主妇与ERP
- 【数仓】大数据领域建模综述-《大数据之路》读书笔记
- format mla_MLA-Format-MLA格式
- 如何绘制四线3格拼音
- uboot中bss的理解
- AHU 超算中心 指令
- mars java android_Mars Android 接入指南
- TNS-12547和TNS-12555错误解决
- 粒子滤波(particle filtering)梳理
- ffmpeg h264文件转mp4
- 量子退火Python实战(3):投资组合优化(Portfolio) MathorCup2023特供PyQUBO教程
热门文章
- 使用Sigar采系统信息
- 注册AppStore开发者账号以及收款设置的流程详解(2019最新版)
- 1个超强的软件工具箱!100+个电脑必备工具,随意使用!盘姬
- java工具类专利申请文档_Java工具类 (3)------WordUtils------利用Poi根据模板生成新的word文档...
- xml转excel(Office XML转excel)
- linux NVMe驱动总结
- SQL查询数据以及排序
- 2021年软件测试面试题大全
- 软件测试笔试面试题目完全汇总
- java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式