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