在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

Jeff Dean 谈如何在大型在线服务中做到快速响应

  • 2014-07-13
  • 本文字数:2644 字

    阅读完需:约 9 分钟

6 月于硅谷举行的 Velocity 2014 大会上,Google 首席科学家 Jeff Dean 做了一场题为《Achieving Rapid Response Times In Large Online Services》的主题演讲,分享了让大型系统运行更加流程以便改善用户体验的种种方法。

Jeff 首先以 Google 的搜索服务为例,说明了何为大扇出服务(Large Fanout Service),即一个搜索请求需要有大量子系统(Web、新闻、图像、视频、博客等等)参与其中,以便提供更丰富的搜索结果。在 Google,基本不会为特定的服务提供特定的机器,而是将服务都部署在一个机器池中,这被称为共享环境(Shared Environment),Google 的共享环境大致会包含以下几个部分——Linux、调度系统、文件系统 ChunkServer、多种其他系统服务、Bigtable Tablet Server、随机 MapReduce 任务、CPU 密集型任务以及随机应用。它的好处是可以极大地提升利用率,但同时也会带来诸多无法预测的问题,比如网络拥塞等等。尤其是响应时间的长尾现象比较明显,一次请求的平均响应时间是 10 毫秒,但是却有 99%ile 的响应时间大于 1 秒,在大扇出服务中,如果需要调用 100 台服务器获得最终结果,那有 63% 的请求耗时会大于 1 秒。

针对延时问题,有些基本的降低延时的技术:

  • 定义不同的服务级别,针对服务器上的请求队列和网络流量设定优先级。
  • 减少线头阻塞(head-of-line blocking),将大的请求打散成一系列小请求;比如,一个读请求需要读取 64MB 数据,而另有一个 100KB 的读请求必须等前者完成了才能得到处理,此时可以将大请求分为多个小请求,以便 100KB 的那个请求能及时得到处理。
  • 管理好昂贵的后台活动,比如分布式存储系统中的日志压缩就算昂贵的后台活动,此类活动可以考虑在负载低峰期去执行。

Jeff 指出,我们要做的事就是基于一堆不可靠的资源打造一个可靠的整体,基于一堆无法预估的资源打造可以预测的整体。在延时处理方面,Jeff 将对应的技术分为两大块:

  • 跨请求适应(cross request adaptation),通过检测最近的行为,采取一些措施来优化后续的请求处理,通常会和负载均衡有关,生效时间大约是十几秒到几分钟。
  • 同请求适应(within request adaptation),在当次请求中,对响应较慢的子系统采取一些措施,以改善本次请求的整体响应时间,通常是立刻生效的。

随后,他分别就两类技术进行具体展开说明。

1. 跨请求适应

可以通过细粒度的动态分区,将大数据集或大型计算拆分到多台服务器上,一般一台服务器上会分到 10 到 100 个块,BigTable 和 GFS 就是这么处理的。

这么做的好处是显而易见的,比如,当一台机器负载过重时,可以将其中的一部分内容移动到另一台上;可以加速故障恢复,多台服务器分别恢复不同的数据块;实现选择性复制,针对重度使用的内容可以动态或静态地生成更多副本。

当服务器的响应变慢时,有可能这和当时发送的数据有关,但更多情况下是受到干扰的影响,比如共享服务器上其他任务造成的 CPU 或网络尖刺。此时可以选择将部分负载移动到其他服务器上以便改善延时情况,也可以在其他服务器上创建更多该分区的副本,继续给这台服务器发送请求(正常请求发给其他服务器了,发给本服务器的请求只是一份镜像)持续观察延时情况,待延时正常后再让其提供正常服务。

2. 同请求适应

同请求适应的目标是在不会增加太多资源消耗的情况下减少整体延时,同时还要保障系统安全运行。

有时一些失败是和请求数据有关的,比如一些测试过程中没有发现的“奇怪数据”会造成系统宕机等等,如果一次性将有问题的请求发给所有节点,那么所有节点就都出问题了。在 Google 会使用一种名为 Canary Requests 的请求,即把请求先发给一个节点,收到响应后,基本可以证明这个查询是可行的,随后再将其发给其他节点。

Jeff 在随后的时间里详细介绍了他们使用的另一项技术——备份请求(Backup Requests),大致的思路是先把请求发给一个副本,请求会被放进队列;随后再给另一个副本发送相同请求,如果第二个副本处理地很快,处理完毕后发回结果,客户端再给第一个副本发送取消任务请求。

以 In-memory BigTable Lookups 为例,数据存储了两份,将在 100 个 Tablet 中发送 1000 个键查询,统计最后一个键返回的总耗时。在没有备份请求时,平均耗时 33 毫秒,99%ile 为 52 毫秒,99.9%ile 高达 994 毫秒;当在 10 毫秒后发送备份请求时,平均耗时降为 14 毫秒,99%ile 和 99.9%ile 分别降到了 23 毫秒和 50 毫秒,此外还测试了在 50 毫秒后发送备份请求的情况,耗时同样比没有备份要好,但较前者表现略逊一筹。本案例中,延时 10 毫秒的备份请求仅增加了不到 5% 的额外请求负担,在延时 50 毫秒的情况下,更是下降到不足 1%。可见备份请求能在很大程度上改善延时的长尾效应,同时并未增加太多开销。

备份请求技术还可进一步优化,在发送请求时将处理请求的另一台服务器信息也纳入请求中,一旦一台服务器开始执行,就直接通知另一台取消执行,这项优化称为跨服务器取消。Jeff 同样提供了一个例子,在分布式文件系统客户端中发送读请求,等待 2 毫秒后发送备份请求,耗时情况如下:

  • 集群处于空闲状态
    • 没有备份请求,50%ile 为 19 毫秒,90%ile 为 38 毫秒,99%ile 为 67 毫秒,99.9%ile 为 98 毫秒
    • 有备份请求,50%ile 为 16 毫秒,90%ile 为 28 毫秒,99%ile 为 38 毫秒,99.9%ile 为 51 毫秒
  • 集群正在进行大量排序
    • 没有备份请求,50%ile 为 24 毫秒,90%ile 为 56 毫秒,99%ile 为 108 毫秒,99.9%ile 为 159 毫秒
    • 有备份请求,50%ile 为 19 毫秒,90%ile 为 35 毫秒,99%ile 为 67 毫秒,99.9%ile 为 108 毫秒

两种情况下,使用备份请求延时都有显著改善,99%ile 分别下降了 43% 和 38%,在第二种情况下备份请求只引入了大约 1% 的额外磁盘读请求。如果没有备份请求,集群需要一直处于低负载状态,而使用了备份请求,集群则可处于相对较高的负载,同时还能有相对较好的响应延时。

对于备份请求而言,最坏的情况即是两台机器几乎同时收到请求,并且都处理了请求,这会带来一定的资源浪费。当然,也可以引入第三个请求,但通常情况下向两台服务器发送请求就已经足够了。在演讲后的 Office Hour 中,Jeff 表示备份请求也不是万能的,对于一些不可重复执行得请求,比如在线交易,就不能使用备份请求,以免造成数据不一致等情况。

在本次 Velocity 大会上,Jeff Dean 的演讲时间较短,如果您对他的具体演讲内容感兴趣,可以观看官方视频。同时,也推荐您去阅读 2013 年 Jeff Dean在斯坦福的演讲还有一篇更早的材料。我们希望有一天能够邀请到 Jeff 到国内现场为广大 InfoQ 的读者做一次分享,到时您会来参加么?

2014-07-13 08:487562
用户头像

发布了 135 篇内容, 共 67.4 次阅读, 收获喜欢 43 次。

关注

评论

发布
暂无评论
发现更多内容

浅析Node中间件Koa&Express:原理和实现

云小梦

JavaScript node.js 中间件 koa

Mac下brew更新及安装Prometheus+Grafana

程序员架构进阶

容器 Prometheus 监控系统 28天写作 3月日更

企业利用边缘计算的10种方式

边缘计算

云图说|一张图带你了解华为云分布式数据库中间件

华为云开发者联盟

数据库中间件 DDM 分布式数据库中间件 华为分布式数据库中间件

Img、net & page新展望:连接感知

云小梦

JavaScript html 网络 用户体验 连接感知

2021春招JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

Java 编程 程序员 架构 面试

ONE MORE

吴小平

React 中后台系统多页签实现

清秋

Vue 大前端 React keepalive

Logstash 中 Ruby filter 使用指南

Langer

ruby Logstash ELK

区块链溯源,茶叶溯源平台的搭建

13828808769

#区块链#

HTML5+CSS3高级动画的应用实践

云小梦

JavaScript html css3 浏览器API 网页动画

架构师训练营 4 期 第13周

引花眠

架构师训练营 4 期

数据分析作业-用户分析-ReadHub

隋泽

产品经理训练营

尤雨溪 Twitch 直播:下一代前端构建工具 ViteJS —— Open Source Friday

清秋

翻译 大前端 vite webpack 构建工具

一个魔幻的框架,3分钟纯 Java 注解搭个管理系统

程序员小富

Java 大前端 后端

SpringBoot + Mybatis + Druid + PageHelper在多数据源下如何配置并实现分页

北游学Java

Java mybatis spring Boot Starter

散列(哈希)表算法学习

Nick

数据结构 算法 哈希算法

开源项目月刊《HelloGitHub》第 60 期

HelloGitHub

GitHub 开源

Java程序员都要懂得知识点:反射

华为云开发者联盟

Java 对象 反射 class 函数

一文搞懂如何实现 Go 超时控制

万俊峰Kevin

微服务 超时 Go 语言

如何学习数据结构与算法

C语言与CPP编程

c c++ 数据结构 程序人生 算法

区块链溯源服务平台,区块链商品防伪溯源解决方案

13828808769

区块链+ #区块链#

Python OpenCV setMouseCallback 回调函数,取经之旅第 13 天

梦想橡皮擦

3月日更

实现一个“能中断”的ajax

云小梦

JavaScript ajax Promise axios 请求拦截

用户体验 | 页面阅读进度提示

云小梦

html css3 用户体验 页面进度提示

浅析 Fabric Peer 节点

Rayjun

使用Flask Nginx Gunicorn和Supervisor部署一个简单的Restful API接口服务器

Langer

Python 部署与维护 服务器部署 web服务

第八章作业

LouisN

华为云自研PB级分布式时序数据库揭秘第一期初识GaussDB(for Influx)

华为云开发者联盟

云原生 时序数据库 华为云 分布式时序数据库 GaussDB(for Influx)

区块链溯源,茶叶溯源平台的搭建

13828808769

区块链+ #区块链#

智慧公安警务系统搭建,警务大数据可视化分析平台解决方案

13828808769

智慧城市

Jeff Dean谈如何在大型在线服务中做到快速响应_Google_丁雪丰_InfoQ精选文章