点击▲关注 “ IT168企业级 ”给公众号置顶
更多精彩 第一时间直达

-
可扩展计算实例(AWS EC2)
-
可扩展存储(AWS S3)
-
业务逻辑微服务(Netflix 专用框架)
-
可扩展的分布式数据库(AWS DynamoDB、Cassandra)
-
大数据处理和分析作业(AWS EMR、Hadoop、Spark、Flink、Kafka 和一些 Netflix 专用工具)
-
视频处理和转码(Netflix 专用工具)

-
OCA 不断将关于其负载状态、可路由性和可用视频的运行状况报告发送到在 AWS EC2 中运行的缓存控制(Cache Control)服务上,以便 Playback 应用向客户端更新最新的健康 OCA。
-
播放(Play)请求从客户端设备发送到在 AWS EC2 上运行的 Netflix 播放应用服务,以获取流视频的 URL。
-
Playback 应用服务必须确定播放请求是有效的,才能观看特定视频。这里的验证流程将检查用户的订阅计划,以及在不同国家 / 地区的视频许可等。
-
Playback 应用服务会与同在 AWS EC2 中运行的引导(Steering) 服务对话,以获取所请求视频的合适的 OCA 服务器列表。引导服务使用客户端的 IP 地址和 ISP 信息来确定一组最适合该客户端的 OCA。
-
客户端从 Playback 应用服务返回的 10 个 OCA 服务器的列表中测试这些 OCA 的网络连接质量,并选择最快、最可靠的 OCA 来请求视频文件,进行流传输。
-
选定的 OCA 服务器接受来自客户端的请求并开始流传输视频。

-
客户端向在 AWS 上运行的后端发送一个播放请求。该请求由 AWS 负载均衡器(ELB)处理。
-
AWS ELB 会将请求转发到在 AWS EC2 实例上运行的 API 网关服务上。名为 Zuul 的组件是由 Netflix 团队构建的,提供动态路由、流量监控和安全性,以及对云部署边缘故障的恢复能力。该请求将应用在与业务逻辑对应的一些预定义过滤器上,然后转发到应用程序(Application)API 做进一步处理。
-
应用程序 API 组件是 Netflix 运营背后的核心业务逻辑。有几种类型的 API 对应不同的用户活动,如注册 API 和用于检索视频推荐的推荐 API 等。在这里,来自 API 网关服务的转发请求由播放 API 处理。
-
播放 API 将调用一个或一系列微服务来满足请求。图 1 中的播放应用服务、引导服务和缓存控制服务可以视为微服务。
-
微服务主要是无状态的小型程序,并且也可以相互调用。为了控制其级联故障并获得弹性, Hystrix 将每个微服务与调用者进程隔离开来。其运行结果可以缓存在基于内存的缓存中,以更快地访问那些关键的低延迟请求。
-
微服务能在流程中保存到数据存储或从数据存储中获取数据。
-
微服务可以将用于跟踪用户活动或其他数据的事件发送到流处理管道(Stream Processing Pipeline),以实时处理个性化推荐任务,或批处理业务智能任务。
-
来自流处理管道的数据能持久存储到其他数据存储中,如 AWS S3、Hadoop HDFS 和 Cassandra 等。

-
客户端应用(Client App)会将自己与后端的连接分为 2 种类型,分别用于内容发现(Content discovery)和内容播放。客户端对播放请求使用 NTBA 协议,以确保其 OCA 服务器位置具有更高的安全性,并消除了新连接的 SSL/TLS 握手引起的延迟。
-
在流传输视频时,如果网络连接过载或出现错误,客户端应用会智能地降低视频质量或切换到其他 OCA 服务器上。即使连接的 OCA 过载或出现故障,客户端应用也可以轻松切换为其他 OCA 服务器,以获得更好的观看体验。之所以客户端能实现所有这些目标,是因为其上的 Netflix Platform SDK 一直在跟踪从播放应用服务中检索到的最新健康 OCA 列表。

-
入站过滤器(Inbound Filter)可用于身份验证、路由和装饰请求。
-
端点过滤器(Endpoint Filter)可用于返回静态资源或将请求路由到适当的 Origin 或应用程序 API 做进一步处理。
-
出站过滤器(Outbound Filter)可用于跟踪指标、装饰对用户的响应或添加自定义标头。
-
Zuul 集成了服务发现组件 Eureka ,从而能够发现新的应用程序 API。
-
Zuul 被广泛用于各种用途的流量路由任务上,例如启用新的应用程序 API、负载测试、在负载很大的情况下路由到不同的服务端点上,等等。

-
在播放 API 实现的最新更新中,播放 API 和微服务之间的网络协议是 gRPC/HTTP2,它“允许通过协议缓冲区定义 RPC 方法和实体,并自动以多种语言生成客户端库 /SDK”。此项更改使应用程序 API 可以通过双向通信与自动生成的客户端进行适当集成,并“尽可能减少跨服务边界的代码重用”。
-
应用程序 API 还提供了一种基于 Hystrix 命令的通用弹性机制,以保护其底层微服务。

-
来自 API 网关服务的每个请求都将放入应用程序 API 的网络事件循环(Network Event Loop)中处理;
-
每个请求将被一个专用的线程处理程序阻止,该处理程序将 Hystrix 命令(如 getCustomerInfo 和 getDeviceInfo 等)放入传出事件循环(Outgoing Event Loop)中。传出事件循环是针对每个客户端设置的,并以非阻塞 I/O 运行。一旦调用的微服务完成或超时,上述专用线程将构造对应的响应。

-
微服务可以独立工作,也能通过 REST 或 gRPC 调用其他微服务。
-
微服务的实现可以类似于图 6 中描述的应用程序 API 的实现:请求将被放入网络事件循环中,而来自其他被调用的微服务的结果将放入异步非阻塞 I/O 中的结果队列。
-
每个微服务能拥有自己的数据存储和一些存放近期结果的内存缓存存储。EVCache 是Netflix 微服务缓存的主要选择。

-
MySQL 数据库用于电影标题管理和交易 / 下单目的。
-
Hadoop 用于基于用户日志的大数据处理。
-
ElasticSearch 为 Netflix 应用提供了标题搜索能力。
-
Cassandra 是基于列的分布式 NoSQL 数据存储,可处理大量读取请求,而没有单点故障。为了优化大规模写请求的延迟,Netflix 使用了 Cassandra,因为它具有最终的一致性能力。

-
这一流处理平台每天处理数以万亿计的事件和 PB 级的数据。随着订户数量的增加,它也会自动扩展。
-
路由(Router)模块支持路由到不同的数据 sink 或应用程序上,而 Kafka 负责路由消息,并为下游系统提供缓冲。
-
流处理即服务(SPaaS)使数据工程师可以构建和监视他们自定义的可管理流处理应用程序,而平台将负责可扩展性和运维。

-
当新的视频文件已成功转码并存储在 AWS S3 上时,AWS 上的控制平面服务会将这些文件传输到 IXP 站点上的 OCA 服务器上。这些 OCA 服务器将应用缓存填充(cache fill),将这些文件传输到其子网下 ISP 站点上的 OCA 服务器上。
-
当 OCA 服务器成功存储视频文件后,它将能够启用对等填充(peer fill),以根据需要将这些文件复制到同一站点内的其他 OCA 服务器上。
-
在可以看到彼此 IP 地址的 2 个不同站点之间,OCA 可以应用层填充(tier fill)流程,而不是常规的缓存填充。
OCA 之间的填充模式
-
确保全球范围内流服务的高可用性。
-
弹性处理网络故障和系统中断。
-
在各种网络条件下,将每台受支持设备的流传输延迟降至最低。
-
支持高请求量的可扩展性。
-
负载均衡器可以将流量路由到不同的代理服务器上以帮助防止负载超载,从而提高可用性。
-
播放 API 通过 Hystrix 命令控制超时微服务的执行,从而防止级联故障影响其他服务。
-
如果微服务对外部服务或数据存储的调用所花费的时间超出预期,则它可以使用缓存中的数据响应播放 AI。
-
缓存会被复制以加快访问速度。
-
用一致性换取低延迟
-
用一致性换取高可用性
作者:Cao Duc Nguyen 来源:https://medium.com/swlh/a-design-analysis-of-cloud-based-microservices-architecture-at