文档章节

【转载】跟花和尚学系统设计:明星公司之Netflix(中篇)

摩云飞
 摩云飞
发布于 2016/10/04 12:31
字数 2074
阅读 308
收藏 2

Netflix开源项目Deep Dive

上篇给了大家很多Netflix和Netflix OSS的context。本篇将直入主题,在这里笔者选择几个有代表性且用户数量多的明星项目跟大家一起分享。

Asgard/Spinnaker

我还记得new grad的时候进公司不久问了老板一个问题:"我们每次deploy时,service就down了,我们岂不是会丢掉很多requests?" 我当时的老板一口茶差点没喷出来。

后来我才知道原来changes可以分步deploy到hosts上。具体步骤分为3步:

  • 在deployment前从VIP/Load balancer/DNS disable该host;
  • Deployment。host运行app版本被更新为最新版; -在deployment完成后再把host加回VIP/Load balancer/DNS。

在Amazon这个deployment tool叫做Apollo,以后介绍Amazon的文章会专门讲。

当然,说起来简单,如何实现对ASG分批host的deployment?如何在alarm被trigger后rollback deployment?这些都不是一个trivial的问题。幸运的是,Asgard帮我们解决了这个问题。

Asgard界面

Asgard是一个deployment management tool。它与AWS tightly coupled together,提供了一个简单的平台和UI帮助你实现deployment的管理。它管理了Elastic Load Balancers (ELBs), Auto Scaling Group (ASG), Amazon Machine Image(AMI)的更新和交互,以及deployment fast rollback和task automation。

ASG, AMI和ELB在deployment中的交互过程

Asgard解决了deployment的问题,但也带来了新问题:

  • 随着业界的发展 Continuous Delivery(a.k.a. CD)成了下一个the thing。SDE们希望随时可以test并deploy 且拥有不同的deployment stage(e.g. alpha, beta, gamma, onebox and prod)
  • 如果我不想使用AWS怎么办?
  • 很多人fork了asgard的branch并没有contribute back

为了解决这些问题,Netflix创建了Spinnaker。

Spinnaker

值得一提的是,Spinnaker的出现并不是说明Asgard是不重要的,而是在Asgard的原有functionality的基础上又添加了更多功能来实现CD。它解决了笔者抛出的以上3个问题:

  • 提供了一个完整的Deployment Pipeline。包含了不同的stage和testing workflow。
  • 支持多个平台,包括AWS, Google Cloud Platform, Microsoft Azure, etc。
  • 更开放的开源平台,支持community support and contribution。

相关链接:

Eureka

Eureka是Netflix提供的mid-tier service registry service。它的主要作用是Service Discovery。笔者管它叫做"Service of Services"。

你可能会问:为什么不能用普通的VIP?

原因是AWS的EC2 instances come and go,并不是static的hosts,所以也没有static的IP和hostname。这就需要更复杂的load balancer来处理不停变化的cluster

你可能又会问:那AWS自带的ELB总可以handle EC2 instances的come and go的不确定性吧?为什么不直接使用,而要reinvent the wheel呢?

这是个好问题。要解释清楚这个事情 还要牵扯到Microservices的概念。

Netflix microservices dependency graph

Microservices究竟是什么意思呢?用笔者自己的话来解释,其实就是一种观点:这种观点认为与其做一个超级无敌大的单个application(a.k.a. Monolithic application)来handle所有business logic,不如做一批量的microservices,每一个microservice处理一块相对独立的business logic,然后把所有microservices以dependency graph的形式相互依存连接起来。

Monolithic application vs. Microservices

Microservices的优点有:

  • 每个component可以独立选择programming language,Framework。
  • 每个component可以独立scale
  • 每个component可以有独立的strategy实现failover或是degraded experience,而不需要一个大app倒下整个网站都不能用。

关于更深入的Microservices的知识我会单独开一篇文章讲述。

再回来讲ELB,ELB的确可以担负起load balancing这块的责任。那么这种情况下,每一个microservice的前面都需要加一个ELB来做load balancer。这样做的缺点是:

  • ELB的主要用途是做edge service的load balancer。属于heavy-lifting的load balancer,cost不小,也有点大材小用。
  • ELB使用的是外部IP,如果你的service并没有准备handle external traffic,那么too bad,全世界都知道你有这个service了。

Eureka解决的正是这个mid-tier AWS LB的缺失,有了它,你可以方便的知道所有的service并且轻易的integrate(当然authorization也是必须的)。Eureka和下面要提到的Ribbon一起负担了mid-tier ELB的作用。 如下图:

Ribbon

Ribbon

Ribbon是client-side的load balancing tool。它和Eureka一起实现了internal service ELB的功能。

举一个例子,当一个request要从service A发送给service B(也就是Service A的dependency)的时候,service A会先make a request to Eureka,得到service B的metadata,包括hosts信息。然后Ribbon这个library会被调用读取host信息,做出选择来访问其中的一个host然后得到response。

Ribbon有几种选择模式:

  • Simple Round Robin LB
  • Weighted Response Time LB
  • Zone Aware Round Robin LB
  • Random LB

着重讲一下第三种Zone Aware Round Robin LB。这也是Netflix根据AWS的多ASG而量身定做的。在选取host的时候,Ribbon会根据Service A所在的ASG而优先访问同样ASG的service B的host(a.k.a. Zone Affinity)这样减少了latency的同时还节约了cost。

同时,Ribbon还实时监控每个ASG的健康状况。当一个ASG的request数量超过最大值或者当ASG down掉的时候,Ribbon会直接drop掉整个ASG。AWS虽然贵为最稳定的云计算平台,但每隔一两年搞掉一两个ASG甚至一个region还是很正常的,而Netflix网站和traffic却没有因此受到丝毫影响,笔者猜测Ribbon应该是居功至伟。

相关链接:

Hystrix

Hystrix的作用是client-side fail tolerance management。还用刚才的例子:假如Service B down掉了,Service A是否也不能运行?在Netflix的设定下,假如Service A是Netflix的主页面,而Service B是Netflix的recommendation service,那么我们完全可以认为即使Service B完全无法运转,Service A也应该继续运行,即使提供的是degraded experience。

比如在这种情况下,Service A应该得到的结果可以是一个pre-defined top picks list,这样recommend给用户的就是最popular的节目,在一定时间内也不会有任何问题(顺带吐槽一下,大多数recommendation system的performance其实比直接给最popular的shows也没好到哪里去。。。)。

Hystrix还提供了dashboard,供你实时观测有多少request得到的response是fallback behavior,从而估测到每个dependency service的健康状况。只能说非常贴心。

相关链接:

Simian Army/Chaos Monkey

测试Microservices的稳定性一直是个世界级难题,Netflix拥有上百个services,无数种挂掉的combination,作为一个程序猿,我怎么知道在每一种scenario下Netflix是否还能正常运行?你需要另一个猴子帮你:Introducing Simian Army and Chaos Monkey。

Simian Army直译就是类人猿军队,是一个测试套装。其中最有名的就是Chaos Monkey,直译就是制造混乱的猴子。

这个猴子用来干什么呢?它在所有service的dependency graph里,每次随机挑几个service,把它们弄挂(当然testing是在test stage进行的,这时候spinnaker就派上用场了),看看Netflix as a whole的输出结果是否还是expected的(expected behavior严重依赖于Hystrix)。

笔者工作中也进行过很多次gameday,一起测试org下的几十个services,但每一次都是固定的测试某些个系统挂掉的scenario。当笔者第一次看presentation听到这个tool的时候可想而知是相当被震撼到的,也深深的成为了Netflix的脑残粉。

相关链接:

小结

甩了一堆纯干货,想必大家都有点审美疲劳。我们歇一下,这篇就讲到这里。

如果你问本文涵盖了所有Netflix OSS的精华么?答案是否定的。笔者所希望的是,以后当你考虑用一个架构,或者在实践中发现了一个painpoint而且觉得是一个distributed system的通用问题的时候,不妨搜一搜Netflix OSS,说不定早就被Netflix的架构师解决了。

这就没了?

中篇到此结束。别急,下篇我们侃一侃Netflix和AWS那点事儿,并聊一聊Netflix技术以外的八卦。


原文链接:这里

本文转载自:URL居然能超出长度限制,我也是醉了

共有 人打赏支持
摩云飞
粉丝 371
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
王阳明心学

心学 1.王阳明心学核心: 阳明心学集儒、释、道三家之大成,是500年来中国人最精妙的神奇智慧. 哲理:心即理,知行合一,致良知.立志,培根,明镜,克己,圣人之道,吾性自足. 2.古今中外名家评价: ●...

ericSM
2016/06/25
106
0
和尚挑水的故事给我们带来的思想

很值得我们深思!!! 思想决定人的高度。 有两个和尚住在隔壁,所谓隔壁就是隔壁那座山,他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去...

lsy950109
2017/07/03
0
0
我的2017年文章汇总——JDK源码篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangyangzhizhou/article/details/78994519 2018已经开始,可能还有360天结束。 Eventually a single thing ...

超人汪小建(seaboat)
2018/01/07
0
0
Java学习之路:不走弯路,就是捷径

1.如何学习程序设计? Java是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于Java,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用...

捂风挽笑
2017/06/02
274
1
JDK不同操作系统的FileSystem(Windows&Unix-like)

前言 我们知道不同的操作系统有各自的文件系统,这些文件系统又存在很多差异,而Java 因为是跨平台的,所以它必须要统一处理这些不同平台文件系统之间的差异,才能往上提供统一的入口。 关于...

超人汪小建
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用 C 语言编写 Windows 服务程序的五个步骤(转)

摘要   Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并 实现一个简单的服务程...

_编程菜鸟_
19分钟前
0
0
Linux各目录及每个目录的详细介绍

目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/...

若杰
20分钟前
4
0
vue组件系列5、日期选择

插件部分源码 <template> <div class="date-picker" @click.stop> <input class="input" v-model="dateValue" v-on:mouseover="openPanel" /> <!-- 动画特效 --> <transi......

轻轻的往前走
22分钟前
1
0
SQL

BEGIN #定义一个变量来保存该记录是否存在 declare num int; #这条sql,就是查询对应的记录有多少条,注意 into num 这两句话,就是把count(*) 查出的值,赋给到num中 select co...

张泽立
23分钟前
1
0
云栖科技评论87期:建立AI规则非常重要 但充分对话更重要

【卷首语】建立AI规则非常重要 但充分对话更重要    2016年,谷歌CEO Sundar Pichai宣布谷歌战略从Mobile First(移动优先)转向AI First(人工智能优先),在此之后,谷歌不仅在AI领域持续投入...

Mr_zebra
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部