写点什么

从有到优:百度前端接入技术的升级之路

  • 2016-01-17
  • 本文字数:3300 字

    阅读完需:约 11 分钟

在 1 月 16 日,由百度开发者中心和InfoQ 联合主办的“纵谈前端接入技术、SEO 和安全运维”主题沙龙活动中,来自百度开发者中心的资深运维工程师们热情洋溢的分享了百度在前端技术、搜索速度优化和全站使用HTTPS 技术的进展及成果,以及百度在这些方面有哪些宝贵经验可供参考的。演讲嘉宾分别为百度Golang 委员会成员陶春华、专注于网页搜索无线访问速度的工程师许霞,和处理网页搜索可达性、安全搜索等方向事务的主要技术负责人陈曦洋。

Go 语言在 Baidu Front-End 方面的应用实践

Go 语言的广泛流行取决于部署简单、并发性好、良好的语言设计,以及执行性能好。这也是在重写百度前端这一项目上为什么考虑选用 Go 语言的原因所在。陶春华老师介绍说,促使重写 Baidu Front-End 的诱因主要基于以下三点:一是修改成本高。事件驱动的编程模型本身的编码和调试难度都很大;C 语言本身的难度和开发效率有很多限制。二是配置管理方式落后。为单产品线设计,无法支持平台化要求;配置变更(修改、重载、验证)能力差。三是变更和稳定性的矛盾。例如程序出 core 也是比较头疼的事情。

在此前提之下,团队决定使用 Go 语言来重写前端,但是这里也遇到了一些问题,那就是 GC(Gabage Collection)本身难以避免的时间延迟。BFE 的需求是要在 1ms 以内,最大不超过 10ms,一旦超过这个平均值,那么用户体验将大打折扣。而 Go-BFE 实测 100 万连接,400ms GC 延迟。这就需要不断的对 GC 进行优化。

在这里陶老师也介绍了两种优化思路,第一个常见的方法就是将扫描的小对象合并成大对象,利用 Array 来合并一组对象。第二种方法精算性更高一点,可以把消耗内存较多的内容放到 C 里面,因为 Go 语言有一个 CGO 接口,直接通过 Go 调到 C 可以解决这个问题,只不过代价比较大。但是,问题和方案永远是相生相伴的。用 Array 技术重写网络库,所有的 BFE 将永远用 Array 来写,理论上可行。这里的问题又来了,第一风险太大,第二如果 Go 语言升级了,还能不能继续使用下去。

陶老师在这里介绍的解决方法叫做车轮大战。即,在一组工作进程中,进程和服务是等价的,某一个进程跟服务运作到一定时间之后关闭 GC,让它休息,第二个进程代替它服务,以此轮换,构成一个车轮大战的局面。如果在不能直接解决 GC 问题的时候直接关掉服务,然后绕过它。这基本的方案思路也就是关闭继承多进程的轮转战。(如上图)

搜索速度优化的前进之路

在整个百度接入服务里,百度搜索一直秉承提供最基础的三个保障,那就是安全、快速、可靠。许霞首先介绍说,在对速度进行度量之前,先要对数据检测、收集。对客户端数据监测的特点是:可以检测任何对象,成本高,并且监测的指标很固定。JS 埋点检测数据的特点是:可以检测任何指标,甚至可以检测每一条结果的速度。第三方数据检测的特点是:可以定制,并且有一定的海外监测能力,但成本高。

收集数据的意义在于可以很清晰的了解掌握用户的搜索习惯,这对 PV、UV 以及变现收入有很大影响。那么如何贴切搜索引擎的特点做搜索速度的优化?通过三个方面:接入质量提升、后端处理优化和前端渲染优化。接入质量提升主要有两个考察因素:延迟和带宽,对应的也就是优化 RTT 和传输效率。

后端优化其实就是整个搜索引擎的优化了,分为缓存优化和检索优化。缓存优化最基础的方式就是进入、淘汰机制等等,保证淘汰机制是最合理的。检索优化,则需要对硬件以及硬件方案的选择做一些深入考虑。在前端渲染优化方面,除了考虑节省时间之外还要考虑怎样让它定性化。

对优化做决定性决策只是其中的一种方法,还有更聪明的创新方法,那就是关于无线技术。这里面所涉及的内容包括手机终端、机站以及 IP 网络,传输速度当然是跟这三者有密不可分关系的。机站会根据自己能获得多少收益来处理用户的请求,尽量会缩小头部信息,进行一定程度的数据压缩。手机跟机站之间建立连接以维持这种连接关系。但电耗大是很关键的问题。百度搜索做了维持连接的一些机制,当用户页面空闲很长时间或者放在后台,就可以减少电量的消耗。(如上图)

全站 HTTPS 能否确保网站彻底安全?

2015 年 3 月,百度搜索成为国内首家完成全站 HTTPS 改造的大型站点;且目前来看,全站 HTTPS 已经成为百度产品的首要标准;同时,统一接入平台也大幅提升了 HTTPS 的接入效率和性能。陈曦洋老师在开讲前是这样介绍大背景的。全站 HTTPS 的原因是为了让用户保持良好的使用体验,解决反馈较多的劫持和隐私泄露等问题。这些问题的具体 case,包括页面被加上 URL 参数,不停刷新;页面被 DNS 劫持到其他网站;用户手机号码遭泄漏;白页,搜索功能异常等等。正是出于对用户数据的安全保密,维护网站正常运作的考量,百度专门成立了由百度搜索和运维部组成的 HTTPS-SUPPORT 团队,对 HTTPS 进行深入研究,提供完整的服务,保障用户正常访问百度原始产品。

陈曦洋老师在这里详细介绍了全站 HTTPS 改造的成本,这也是很多人都比较关心的焦点问题,这不仅涉及到证书的部署,还会涉及到激增的计算量,需要多次协商和握手,而用户端搜索的延迟将会给 HTTPS 改造需要解决的问题。除此以外,对于一个大型网站而言,架构如何解决多业务部署 HTTPS 的问题,巨大的页面和模板数量,以及如何解决实际部署中的各种问题,让用户无损 / 平滑的完成切换,其实是更具有挑战性的工作。

计算性能涉及到密钥(证书)的长度,1024 和 2048 位在性能有什么差别呢?原来使用 HTTP 协议的时候,假设 cps 可以达到 2w+,而转换成 HTTPS 之后,cps 只能达到 2-3 千;在访问速度方面,使用了 HTTPS 之后,不做任何优化,访问百度的速度可能会恶化 250-500ms, 一些设计比较差的页面可能会恶化 500-1200ms;在架构和产品成本方面,对于百度这样的综合性网站,牵一发而动全身,仅仅是在页面形式上就要改大量的模板,成本相当大。

那么有没有可选的优化方案呢?陈老师认为,性能优化上优先使用 ECC。这里使用 ECC 密钥长度大小要比 RSA 和 DH 密钥长度短。在硬件的优化上则可以使用硬件加速卡,可以做 TLS 的远程卸载 (小型站点在不面对大量的恶意请求时 完全可以通过纯软件卸载, 只需要保证连接复用率)。在访问速度上的优化上,通过复用连接和协议优化可以尽量减少握手次数,就可以让它接近于原始 HTTP 的性能。怎么去减少握手次数?比如 Session cache 和 Session ticket 可以极大的减少用户在一定时间内再次访问时的计算开销,而 HSTS 能在浏览器内部完成 HTTP 到 HTTPS 的跳转,不再经过一次网络传输和浏览器开销。另外还可以用 SPDY-HTTP2 方案,优点是基于单连接,能进一步提升连接复用比例,协议支持 header 压缩,在无线网络下有重要意义,这些都可以提高访问速度。

除了对协议层进行优化之外,也可以在应用层做些优化,预连接就是一个很好的优化方案。比如在网页端或者客户端,用户发起访问请求之前提前把这个握手过程完成,减少延迟,这一点也很重要。另外陈老师建议站点在发展到一定规模时一定要做整体的接入规划,控制域名数量,一些服务需要变成公共的,比如图片,静态资源的存储和访问。

在最后,陈老师也回答了大家普遍比较关心的问题,那就是使用 HTTPS 就代表着绝对安全吗?事实上并没有绝对地安全,代码是人写的,很多问题都是实际的实现上或者依赖的其他环境上出现了漏洞,OpenSSL HeartBlood 就是最典型的案例,甚至连随机数的生成和一些加密算法上也可能有人为埋下的漏洞,CDN 回源这样的路径很多情况下也是使用的 HTTP。百度使用 HTTPS 只能保护用户在浏览百度产品的时候的安全,但是很多手机号的泄露是第三方站点导致的 (它们会通过非法渠道购买识别用户手机号的服务),这个问题并不能通过百度的 HTTPS 解决。但是相对于 HTTP,HTTPS 的安全防范性能更高,增加了坏人的做恶难度。

-------------------------------------------------------------------

百度开发者中心是百度为企业和个人开发者提供学习、交流、合作和服务的开放平台,汇聚了百度所有对外开放的技术、平台和服务,提供产品孵化、研发支持、运维托管、统计分析、分发推广、换量变现等全方位服务和支持。通过百度的技术开放、搜索推广和应用分发能力,助力开发者加速成功,实现开发者、消费者和百度三方共赢。

2016-01-17 22:393635
用户头像

发布了 181 篇内容, 共 96.3 次阅读, 收获喜欢 207 次。

关注

评论

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

解决 JMeter 返回内容中文乱码问题的详细指南

霍格沃兹测试开发学社

使用 Apache JMeter 吞吐量控制器的详细指南

霍格沃兹测试开发学社

MQTTX 1.10.0 发布:CLI高级文件管理与配置

EMQ映云科技

mqtt mqttx

Exploring IPQ9574 and IPQ5332: Innovations in Wi-Fi 7 Technology

wallyslilly

ipq9574

数据虚拟化和 Data Fabric(数据编织)对企业数据管理意味着什么?

Aloudata

数据管理 数据孤岛 数据虚拟化 Data Fabric 数据编织

Postman 集合变量使用详解

霍格沃兹测试开发学社

数仓安全:数据脱敏技术深度解析

快乐非自愿限量之名

数据库 数仓安全

从钉钉到跨境电商技术演变,HHO通过NineData实现全球化业务布局

NineData

数据安全 数据管理 NineData 两氢一氧 本地机房

使用 Apache JMeter 事务控制器的详细指南

霍格沃兹测试开发学社

多环境镜像晋级/复用最佳实践

阿里巴巴云原生

阿里云 云原生 云效

破除“数据孤岛”新策略:Data Fabric(数据编织)和逻辑数据平台

Aloudata

数据管理 数据孤岛 数据虚拟化 Data Fabric 数据编织

VMware vCenter Server 8.0U2d 下载 - 修复堆溢出 (远程执行代码) 和本地权限提升漏洞

sysin

vSphere vmware vcenter esxi

深入分析四层/七层网关

不在线第一只蜗牛

网关

使用 Apache JMeter Flexible File Writer 插件的详细指南

霍格沃兹测试开发学社

利用JAVA语言调用GLM-4接口实战指南

幂简集成

Java API 大模型

解决华为NEXT应用开发中模拟器组件缺失问题

彭康佳

鸿蒙 an'droid

Altair 助力优化摩托车空气动力学性能,实现最佳的整流罩设计

Altair RapidMiner

人工智能 仿真 AIGC altair

2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组

福大大架构师每日一题

福大大架构师每日一题

使用Python获取HTTP请求头数据

霍格沃兹测试开发学社

快速掌握 WinRAR:详细安装与使用指南

霍格沃兹测试开发学社

报名参加通义灵码高校训练营,领 300 元阿里云产品通用抵扣金

阿里云云效

阿里云 云原生

英伟达成全球市值第一公司;苹果暂停下一代高端头显研发丨 RTE 开发者日报 Vol.227

声网

火山引擎×OPPO,以多样化AI智能体为手机用户带来全新体验

新消费日报

网络调试利器:Chrome Network工具的详细指南

霍格沃兹测试开发学社

报名参加通义灵码高校训练营,领 300 元阿里云产品通用抵扣金

阿里巴巴云原生

阿里云 云原生 通义灵码

使用 Apache JMeter 调度器的详细指南

霍格沃兹测试开发学社

手写一个简单的DI类库

爱吃小舅的鱼

软件设计 DI类库

使用Python获取HTTP请求头数据

霍格沃兹测试开发学社

VMware vCenter Server 7.0U3r 下载 - 修复堆溢出 (远程执行代码) 和本地权限提升漏洞

sysin

vSphere vcenter esxi

华为阅读亮相BIBF:以AI赋能出版行业,引领阅读新业态

最新动态

VMware vCenter Server 8.0U1e 下载 - 修复堆溢出 (远程执行代码) 和本地权限提升漏洞

sysin

vSphere vcenter esxi

从有到优:百度前端接入技术的升级之路_语言 & 开发_Xue Liang_InfoQ精选文章