阿里巴巴为什么不用 ZooKeeper 做服务发现?
码农突围
共 8437字,需浏览 17分钟
· 2020-09-02
数据一致性需求分析
Si = F(service-name)
,以 service-name
为查询参数,service-name
对应的服务的可用的 endpoints (ip:port)
列表为返回值.注: 后文将 service 简写为 svc。
endpoints (ip:port)
不一致性带来的影响,即 CAP 中的 C 不满足带来的后果 :分区容忍及可用性需求分析
难以掌握的 Client/Session 状态机
难以承受的异常处理
如果说要选出应用开发者在使用 ZooKeeper 的过程中,最需要了解清楚的事情?那么根据我们之前的支持经验,一定是异常处理。 当所有一切(宿主机,磁盘,网络等等)都很幸运的正常工作的时候,应用与 ZooKeeper 可能也会运行的很好,但不幸的是,我们整天会面对各种意外,而且这遵循墨菲定律,意料之外的坏事情总是在你最担心的时候发生。 所以务必仔细了解 ZooKeeper 在一些场景下会出现的异常和错误,确保您正确的理解了这些异常和错误,以及知道您的应用如何正确的处理这些情况。
ConnectionLossException 和 Disconnected 事件
简单来说,这是个可以在同一个 ZooKeeper Session 恢复的异常 (Recoverable), 但是应用开发者需要负责将应用恢复到正确的状态。 发生这个异常的原因有很多,例如应用机器与 ZooKeeper 节点之间网络闪断,ZooKeeper 节点宕机,服务端 Full GC 时间超长,甚至你的应用进程 Hang 死,应用进程 Full GC 时间超长之后恢复都有可能。 要理解这个异常,需要了解分布式应用中的一个典型的问题,如下图: 在一个典型的客户端请求、服务端响应中,当它们之间的长连接闪断的时候,客户端感知到这个闪断事件的时候,会处在一个比较尴尬的境地,那就是无法确定该事件发生时附近的那个请求到底处在什么状态,Server 端到底收到这个请求了么?已经处理了么?因为无法确定这一点,所以当客户端重新连接上 Server 之后,这个请求是否应该重试(Retry)就也要打一个问号。 所以在处理连接断开事件中,应用开发者必须清楚处于闪断附近的那个请求是什么(这常常难以判断),该请求是否是幂等的,对于业务请求在 Server 端服务处理上对于"仅处理一次" "最多处理一次" "最少处理一次"语义要有选择和预期。 举个例子,如果应用在收到 ConnectionLossException 时,之前的请求是 Create 操作,那么应用的 catch 到这个异常,应用一个可能的恢复逻辑就是,判断之前请求创建的节点的是否已经存在了,如果存在就不要再创建了,否则就创建。 再比如,如果应用使用了 exists Watch 去监听一个不存在的节点的创建的事件,那么在 ConnectionLossException 的期间,有可能遇到的情况是,在这个闪断期间,其它的客户端进程可能已经创建了节点,并且又已经删除了,那么对于当前应用来说,就 miss 了一次关心的节点的创建事件,这种 miss 对应用的影响是什么?是可以忍受的还是不可接受?需要应用开发者自己根据业务语义去评估和处理。
SessionExpiredException 和 SessionExpired 事件
Session 超时是一个不可恢复的异常,这是指应用 Catch 到这个异常的时候,应用不可能在同一个 Session 中恢复应用状态,必须要重新建立新 Session,老 Session 关联的临时节点也可能已经失效,拥有的锁可能已经失效。... 我们阿里巴巴的小伙伴在自行尝试使用 ZooKeeper 做服务发现的过程中,曾经在我们的内网技术论坛上总结过一篇自己踩坑的经验分享 在该文中中肯的提到: ... 在编码过程中发现很多可能存在的陷阱,毛估估,第一次使用 zk 来实现集群管理的人应该有 80% 以上会掉坑,有些坑比较隐蔽,在网络问题或者异常的场景时才会出现,可能很长一段时间才会暴露出来 ...
最近热文
• 太优秀了!26岁当上985博导,这才是乘风破浪的姐姐! • fastjson的作者,在阿里内网被喷,这到底是怎么一回事? • 为什么有些大公司技术弱爆了? • 微软最新声明:若断供中国Windows,概不负责! 最近整理了一份大厂算法刷题指南,包括一些刷题技巧,在知乎上已经有上万赞。同时还整理了一份6000页面试笔记。关注下面公众号,在公众号内回复「刷题」,即可免费获取!回复「加群」,可以邀请你加入读者群!
明天见(。・ω・。)ノ♡
评论
我发现 Lombok的几个骚操作,哈哈好用
大家好,我是小富~前言本文不讨论对错,只讲骚操作。有的方法看看就好,知道可以这么用,但是否应用到实际开发中,那就仁者见仁,智者见智了。一万个读者就会有一万个哈姆雷特,希望这篇文章能够给您带来一些思考。耐心看完,你一定会有所收获。@onX例如 onConstructor, oMet
程序员内点事
0
BigDecimal 为什么可以保证精度不丢失?
来源:juejin.cn/post/7348709938023940136👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
我发现这款浏览器真不错
“软件分享”只分享好玩有趣的黑科技软件很多人都知道我的电脑安装了10款浏览器,每一款浏览器都有自己的分工,国内外的浏览器基本都用过,今天我又发现了一款浏览器。下载用了一下午感觉还很符合国内用户使用,这款浏览器叫CentBrowser(百分浏览器)。可以说是谷歌浏览器增强版吧。Cent Browser
一锅汤软件
2
为什么我们公司还在用 Python 开发项目?
作者:哇哒嘻哇https://www.zhihu.com/question/278798145/answer/3416549119最近几年里,经常看到某些曾重度使用 Python 的大公司迁移成其它语言技术栈,但是,那些小公司/小团队的情况如何呢?一直很想了解那些仍在坚持使用 Python,且支撑业
机器学习算法与Python实战
0
springboot第70集:字节跳动后端三面经,一文让你走出微服务迷雾架构周刊
创建一个使用Kubernetes (K8s) 和 Jenkins 来自动化 GitLab 前端项目打包的CI/CD流水线,需要配置多个组件。下面,我将概述一个基本的设置步骤和示例脚本,以帮助你理解如何使用这些工具整合一个自动化流程。前提条件确保你已经有:Kubernetes 集群:用于部署 Jenk
程序源代码
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 R Bookdown 做本书,上线
我的写作基础设施:1、Typora2、Cloudflare R23、Picgo4、Obsidian5、GitHub6、mdnice本合集会一一介绍上述工具的安装、配置、使用等等还会介绍:服务器配置GitHub Pages、Cloudflare Pages、Vercel 的使用用 Jekyll、Boo
机器学习算法与Python实战
0
美国司法部重判币安创始人CZ,他到底做错了什么?
注:4月24日,美国司法部表示币安创始人兼前首席执行官赵长鹏应在监狱服刑三年(36个月),根据给出的理由显示,美国司法部律师认为赵长鹏帮助币安违反联邦制裁和洗钱法,并称其必须付出更大的代价,所以应该提高刑期。就在审判前,CZ在写给负责此案件的法官理查德· A · 琼斯的一封信中,为自己的「错误决定」
区块链头条
3