Netflix发布云中间层服务开源项目Ribbon
1月28日,全球最大的互联网视频提供商Netflix在自己的技术团队博客上 发布文章,对外公布了他们的开源项目Ribbon,其主要功能是将Netflix的中间层服务连接在一起。
文章开头说到Ribbon项目的背景:
Netflix使用了细粒度的SOA架构,这是我们基于云的部署模式的根基。目前,我们运行着上百个细粒度服务,使用诸如Netflix API Services这样的“边缘服务(Edge Service)”,共同负责处理面向客户的请求。轻量级的、基于REST的协议,是在这些服务之间进行内部通信的必然之选。
Netflix Internal Web Service Framework(简称NIWS)构成了该架构的基础。我们之前发布的 Eureka,起到服务发现的作用。与Eureka一起,NIWS提供执行REST调用需要的所有组件。
NIWS由REST客户端和服务器端框架构成,基于Java的 JSR-311RESTful API规范。我们的服务使用多种负载数据序列号格式,比如 Avro、XML、JSON、 Thrift和Google Protocol Buffers。NIWS提供序列号和反序列化机制。
接下来,文章重点介绍Ribbon项目:
Ribbon,简单说,主要提供客户侧的软件负载均衡算法。和其他构成我们NIWS内部进程通信栈的组件一起,该算法在Netflix经历了严峻考验。未来几个月,我们会继续开源其他的NIWS组件。请注意:上面提到的负载均衡器是 内部的客户侧负载均衡器,与Eureka一起使用,Eureka主要用来平衡到中间层服务的请求。我们面向公共的边缘服务,继续使用 Amazon的ELB服务。
下面的示意图是Netflix典型的部署架构。
在Netflix,典型的部署架构都是多地区、多区域的部署。Eureka为所有Netflix服务提供服务注册。Ribbon客户端的创建和配置为每个目标服务执行。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:
- 简单轮询负载均衡
- 加权响应时间负载均衡
- 区域感知轮询负载均衡
- 随机负载均衡
文章重点介绍了Ribbon一个久经考验的功能:区域感知负载均衡器(Zone Aware Load Balancer)。
区域感知负载均衡器内置电路跳闸逻辑,可被配置基于区域同源关系(Zone Affinity,也就是更倾向于选择发出调用的服务所在的托管区域内,这样可用降低延迟,节省成本)选择目标服务实例。它监控每个区域中运行的实例的运维行为,而且能够实时快速丢弃一整个区域。在面对整个区域的故障时,这帮我们提升了弹性,我们之前的博客文章有提及。
在选择服务器时,该负载均衡器会采取如下步骤:
- 负载均衡器会检查、计算所有可用区域的状态。如果某个区域中平均每个服务器的活跃请求已经达到配置的阈值,该区域将从活跃服务器列表中排除。如果多于一个区域已经到达阈值,平均每服务器拥有最多活跃请求的区域将被排除。
- 最差的区域被排除后,从剩下的区域中,将按照服务器实例数的概率抽样法选择一个区域。
- 从选定区域中,将会根据给定负载均衡策略规则返回一个服务器。
Ribbon中还包括以下功能:
- 易于与服务发现组件(比如Netflix的Eureka)集成
- 使用 Archaius完成运行时配置
- 使用JMX暴露运维指标,使用 Servo发布
- 多种可插拔的序列化选择
- 异步和批处理操作(即将推出)
- 自动SLA框架(即将推出)
- 系统管理/指标控制台(即将推出)
文中还提到:
Netflix,我们会使用Hystrix包装Ribbon发起的REST调用。 Hystrix提供分布式系统中的延迟和容错。
更多关于Ribbon的详细信息,可查看 Github相关页面。
Netflix在Github上有 诸多开源项目,下面对上文中提到的一些项目做简单介绍:
- Eureka:一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。InfoQ中文站 此前有报道。
- Archaius:包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等等功能。
- Servo:用Java语言,提供暴露、发布应用运行指标的简单接口,主要满足的需求包括:使用JMX、简单、灵活发布。
- Hystrix:供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
郑柯 郑柯,实用的理想主义者,相信:每天改变一点点,这个世界会更好。