揭秘井井有条的流水线(ZooKeeper 原理篇)
本文作者:HelloGitHub-老荀
Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源、有趣、入门级的 ZooKeeper 教程,面向有编程基础的新手。
ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 曾经是 Hadoop 的一个子项目,但现在是一个顶级独立的开源项目。
本系列教程是从零开始讲解 ZooKeeper,内容从最基础的安装使用到背后原理和源码的讲解,整个系列希望通过有趣文字、诙谐的气氛中让 ZK 的知识“钻”进你聪明的大脑。本教程是开放式:开源、协作,所以不管你是新手还是老司机,我们都希望你可以加入到本教程的贡献中,一起让这个教程变得更好:
- 新手:参与修改文中的错字、病句、拼写、排版等问题
- 使用者:参与到内容的讨论和问题解答、帮助其他人的事情
- 老司机:参与到文章的编写中,让你的名字出现在作者一栏
从今天这篇开始,开始进入 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 原理部分的疑问,可以来我创建的话题中来讨论,方便记录和答疑:
我会为每一篇文章建立一个话题,这样你就可以在其中讨论,把你的问题困惑描述清楚。
关注 HelloGitHub 公众号 收到第一时间的更新。
还有更多开源项目的介绍和宝藏项目等待你的发掘。
揭秘井井有条的流水线(ZooKeeper 原理篇)的更多相关文章
- 坐下坐下,基本操作(ZooKeeper 操作篇)
本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. Z ...
- 分布式协调服务Zookeeper扫盲篇
分布式协调服务Zookeeper扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为运维工程师对kubernetes(k8s)可能比较熟,那么etcd(go语言实现)分布式协 ...
- Apache ZooKeeper原理剖析及分布式理论名企高频面试v3.7.0
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache ZooKeeper官网 https://zookeeper.apache.org/ 最新版本3.7.0 ...
- Cesium原理篇:5最长的一帧之影像
如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...
- Cesium原理篇:3最长的一帧之地形(2:高度图)
这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面. 此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...
- Cesium原理篇:7最长的一帧之Entity(下)
上一篇,我们介绍了当我们添加一个Entity时,通过Graphics封装其对应参数,通过EntityCollection.Add方法,将EntityCollection的Entity传递到DataSo ...
- Esfog_UnityShader教程_遮挡描边(原理篇)
咳咳,有段时间没有更新了,最近有点懒!把不少精力都放在C++身上了.闲言少叙,今天要讲的可和之前的几篇有所不同了,这次是一个次综合应用.这篇内容中与之前不同主要体现在下面几点上. 1.之前我们写的都是 ...
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- iOS:app直播---原理篇
[如何快速的开发一个完整的iOS直播app](原理篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/7b2f1df74420 一.个人见解(直播难与易) 直播 ...
随机推荐
- dig的安装和使用
-bash: dig: command not found 解决办法: yum -y install bind-utils dig www.baid bu.com 查看a记录 dig www.ba ...
- poj-Decoding Morse Sequences(动态规划)
Description Before the digital age, the most common "binary" code for radio communication ...
- linux系统图形化管理工具
webmin是一个非常好的图形化管理工具,提供了系统管理员对于linux系统的运维效率.对于那些记不住命令,新入门的新手真的是一个很好的工具呀,上图吧. 这是系统管理的首页,可以看到,CPU,内存.虚 ...
- BAPI_MATERIAL_BOM_GROUP_CREATE创建BOM
天使用BAPI函数:BAPI_MATERIAL_BOM_GROUP_CREATE创建BOM组数据,过程中发现很多问题啊.总结如下: BOMGROUP VARIANTS 这两个参数必须要传 ...
- 特斯拉Toolbox诊断检测仪工具Tesla诊断电脑 Tesla Toolbox
Tesla特斯拉Toolbox诊断工具Tesla诊断电脑检测仪 Tesla Toolbox, Tesla Toolbox Diagnostic Tester.Language: English,Deu ...
- 04. struts2中Result配置的各种视图转发类型
概述 <action name="helloworld" class="com.liuyong666.action.HelloWorldAction"&g ...
- 常用的hadoop和yarn的端口总结
节点 默认端口 用途说明 HDFS DataNode 50010 datanode服务端口,用于数据传输 50075 http服务的端口 50475 https服务的端口 50020 ipc服务的端口 ...
- Avoid catching exceptions inside atomic! You may need to manually revert model state when rolling back a transaction. 避免异常程序不抛错误 回滚 导致 自增id不连续。
https://docs.djangoproject.com/en/3.0/topics/db/transactions/ You may need to manually revert model ...
- 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...
- es5和es6的区别
ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化ECMAScript6,即ES6,是ECMAScript的第六次修订,于2015年完成,也称ES2015ES ...