Netflix 发布云中间层服务开源项目:Ribbon

jopen 11年前

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 发布云中间层服务开源项目:Ribbon

在Netflix,典型的部署架构都是多地区、多区域的部署。Eureka为所有Netflix服务提供服务注册。Ribbon客户端的创建和配置 为每个目标服务执行。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组 件。下面是用到的一些负载均衡策略:

  • 简单轮询负载均衡
  • 加权响应时间负载均衡
  • 区域感知轮询负载均衡
  • 随机负载均衡

文章重点介绍了Ribbon一个久经考验的功能:区域感知负载均衡器(Zone Aware Load Balancer)。

区域感知负载均衡器内置电路跳闸逻辑,可被配置基于区域同源关系(Zone Affinity,也就是更倾向于选择发出调用的服务所在的托管区域内,这样可用降低延迟,节省成本)选择目标服务实例。它监控每个区域中运行的实例的运 维行为,而且能够实时快速丢弃一整个区域。在面对整个区域的故障时,这帮我们提升了弹性,我们之前的博客文章有提及。

在选择服务器时,该负载均衡器会采取如下步骤:

  1. 负载均衡器会检查、计算所有可用区域的状态。如果某个区域中平均每个服务器的活跃请求已经达到配置的阈值,该区域将从活跃服务器列表中排除。如果多于一个区域已经到达阈值,平均每服务器拥有最多活跃请求的区域将被排除。
  2. 最差的区域被排除后,从剩下的区域中,将按照服务器实例数的概率抽样法选择一个区域。
  3. 从选定区域中,将会根据给定负载均衡策略规则返回一个服务器。

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:供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。

来自:InfoQ