Instagram.com网站性能优化之路:第二部分 - 数据推送

news/2024/5/19 8:25:19/文章来源:https://blog.csdn.net/m0_37411791/article/details/103046414

近年来,Instagram发布了许多功能-我们推出了故事,过滤器,创建工具,通知和消息直递,以及许多其他功能和优化。但是,随着产品功能的增长,一个不幸的副作用是我们的网络性能开始下降。在过去的一年中,我们有意识地努力来改善这一状况。到目前为止,我们的不懈努力已使Feed页的加载时间累计提升了近50%。这一系列博客文章将概述我们为实现这些改进所做的一些工作。

页面提前渲染推送数据

在第1部分中,我们展示了如何使用链接预加载使我们能够在页面加载的更早阶段,即在启动请求的脚本加载之前就开始发起动态查询请求。虽然如此,将这些请求作为预加载发出仍然意味着直到HTML页面开始在客户端上渲染之前查询才能开始,这意味着直到2个网络往返完成为止查询都无法开始(再加上生成请求的时间很长) 服务器上的html响应)。正如我们在下面看到的预加载GraphQL查询一样,尽管这是我们在HTML头中预加载的第一批内容之一,但实际上要花很长时间才能真正开始查询。

理想状态下,我们希望预加载的查询在页面请求到达服务器后立即开始执行。但是,如何使浏览器在从服务器接收到任何HTML之前请求某些内容呢?答案是将资源从服务器推送到浏览器,虽然看起来像HTTP / 2推送是此处的解决方案,但实际上有一种非常古老(常常被忽视)的技术可以实现此功能,该技术具有通用的浏览器支持和没有实现HTTP / 2推送的复杂性。自2010年以来,Facebook一直在成功使用此方法(请参阅BigPipe),其他形式也有众多网站(例如Ebay)尝试过,但是JavaScript SPA的开发人员似乎往往忽略了该技术或未使用该技术。它有几个名称-early flush,heading flushing,progressive HTML-并通过结合以下两点来工作:

  • HTTP分块传输编码

  • 浏览器中渐进式HTMl渲染

分块传输编码是作为HTTP / 1.1协议中添加的,从本质上讲,它允许将HTTP网络响应分解为多个“块”,这些“块”可以流式传输到浏览器。然后,浏览器在这些块到达最终完成的响应时将它们缝合在一起。尽管这确实涉及在服务器端呈现页面的方式的相当重大的变化,但是大多数语言和框架都支持呈现分块的响应(在Instagram的情况下,我们在Web前端上使用Django,因此我们使用StreamingHttpResponse对象)。

之所以有用,是因为它允许我们在页面的每个部分完成时将HTML页面的内容流式传输到浏览器,而不必等待整个响应。这意味着我们可以立即将HTML头刷新到浏览器(因此称为“early flush”),因为它不需要太多的服务器端处理。这允许浏览器在服务器忙于在页面其余部分中生成动态数据时开始下载脚本和样式表。您可以在下面看到此效果。

没有采用early flush

采用了early flush


另外,我们可以使用分块编码在完成时将数据发送到客户端。对于服务器端呈现的应用程序,它可以采用HTML形式,但是对于诸如instagram.com之类的单页面应用程序,我们可以将JSON数据推送到浏览器。为了了解其工作原理,让我们看一下单页应用程序启动的传统情况。

首先,将包含呈现页面所需的JavaScript的初始HTML刷新到浏览器。该脚本解析并执行后,将执行XHR查询,该查询将获取引导页面所需的初始数据。

此过程涉及服务器和客户端之间的多次往返,并引入了服务器和客户端都处于空闲状态的时间段。与其让服务器等待客户端请求API响应,不如让服务器在HTML生成后立即开始生成API响应并将其推送到客户端,而不是让服务器等待。这意味着到客户端启动时,数据可能已经准备好,而不必等待另一次往返。 

进行此更改的第一步是创建一个JSON缓存来存储服务器响应。我们通过在页面HTML中使用一个小的内联脚本块来实现此目的,该脚本块充当缓存并列出了服务器将添加到此缓存中的查询(下面以简化形式显示)。

<script type="text/javascript">
// the server will write out the paths of any API calls it plans to
// run server-side so the client knows to wait for the server, rather
// than doing its own XHR request for the data
window.__data = {
'/my/api/path': {
waiting: [],
}
};

window.__dataLoaded = function(path, data) {
const cacheEntry = window.__data[path];
if (cacheEntry) {
cacheEntry.data = data;
for (var i = 0;i < cacheEntry.waiting.length; ++i) {
cacheEntry.waiting[i].resolve(cacheEntry.data);
}
cacheEntry.waiting = [];
}
};
</script>

将HTML刷新到浏览器后,服务器可以自行执行API查询,并在完成查询后,将JSON数据作为包含数据的脚本标签刷新到页面。当浏览器接收并解析此HTML响应块时,它将数据插入JSON缓存中。 

使用此方法要注意的关键一点是,浏览器在接收到响应块时将逐渐进行渲染(即,它们将在流式传输时执行完整的脚本块)。

因此,您可能会在服务器上并行生成大量数据,并在每个响应准备好立即在客户端执行时将其刷新到自己的脚本块中。这是Facebook BigPipe系统背后的基本思想,在该系统中,多个独立的Pagelet并行加载到服务器上,并按它们完成的顺序推送到客户端。

<script type="text/javascript">
window.__dataLoaded('/my/api/path', {
// API json response, wrapped in the function call to
// add it to the JSON cache...
});
</script>

当客户端脚本准备好请求其数据时,而不是发出XHR请求,它首先检查JSON缓存。如果存在响应(或挂起),则它会立即响应,或者等待挂起的响应。

function queryAPI(path) {
const cacheEntry = window.__data[path];
if (!cacheEntry) {
// issue a normal XHR API request
return fetch(path);
} else if (cacheEntry.data) {
// the server has pushed us the data already
return Promise.resolve(cacheEntry.data);
} else {
// the server is still pushing the data
// so we'll put ourselves in the queue to
// be notified when its ready
const waiting = {};
cacheEntry.waiting.push(waiting);
return new Promise((resolve) => {
waiting.resolve = resolve;
});
}
}

这样页面加载行为就变成了下图:

与传统的加载方法相比,服务器和客户端现在可以并行执行更多工作-减少了服务器和客户端彼此等待的空闲时间。这产生了巨大的影响:桌面用户的页面显示完成时间缩短了14%,而移动用户(具有更高的网络等待时间)则提高了23%。

写在最后

这是Instagram网址优化的第二部,第三部分会介绍基于缓存优先进行渲染,第四部分会介绍优化代码大小和执行优化。请关注奶爸码农公众号,第一时间获得最新信息。

『奶爸码农』从事互联网研发工作10+年,经历IBM、SAP、陆金所、携程等国内外IT公司,目前在美团负责餐饮相关大前端技术团队,定期分享关于大前端技术、投资理财、个人成长的思考与总结。

推荐阅读:

Instagram.com网站性能优化之路:第一部分

解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)

解密国内BAT等大厂前端技术体系-腾讯篇(长文建议收藏)

万字长文总结前端测试体系建设与最佳实践

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_844841.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Instagram网站性能优化之路:第三部分 - 缓存优先

原文&#xff1a;https://instagram-engineering.com/making-instagram-com-faster-part-3-cache-first-6f3f130b9669作者&#xff1a;Glenn Conner翻译&#xff1a;奶爸码农近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&…

Instagram.com网站性能优化之路:完结篇-代码大小和执行优化

近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&#xff0c;通知和消息直递&#xff0c;以及许多其他功能和优化。但是&#xff0c;随着产品功能的增长&#xff0c;一个不幸的副作用是我们的网络性能开始下降。在过去的一年…

让网站更快、更可访问与更安全 - 这里有来自谷歌的新建议

这是奶爸码农第67篇原创文章&#xff0c;点击上方蓝字关注从6月30日到7月2日&#xff0c;Google的网络平台团队将Web.dev LIVE的网络社区召集在一起&#xff0c;这是一个在线技术分享活动&#xff0c;旨在讨论平台和工具生态系统的最新发展&#xff0c;使开发人员有机会相互交流…

aspnet网站开发实例_「前言」网站开发实例:公文处理系统(登记部分)一

需求分析与市场分析(简版)电子公文的归档工作是档案管理工作和电子政务建设的重要内容之一&#xff0c;电子公文归档系统作为一个连接办公自动化系统和数字档案管理系统的桥梁&#xff0c;在文档一体化管理体系中占据着重要位置。与传统纸质文档登记归档相比&#xff0c;电子公…

shell脚本监控网站,异常则进行邮件报警

服务器系统centos7.6 1、安装邮箱服务,一般服务器都已经安装了&#xff0c;查看是否安装。 yum list mailx rpm -qa | grep mail 查看是已经安装了。 未安装的执行命令安装即可。 yum -y install mailx 配置mail&#xff0c;配置文件路径/etc/mail.rc vim /etc/mail.rc 在尾部…

云上网站通用解决方案

在创业型公司或阿米巴模式经营的公司&#xff0c;新项目发布初期存在较大的不确定性&#xff0c;既要考虑项目未来的扩展性&#xff0c;又要衡量项目的运营成本。本解决方案为客户提供低成本&#xff0c;敏捷快捷的最佳实践。 典型行业&#xff1a;传统企业、游戏和零售等行业…

阿里云企业通用场景解决方案--企业建站

业务痛点及解决方案* 从企业前期筹备到创立初期&#xff0c;一站式服务为初创企业提供便利&#xff0c;让初创企业得到省心、省时、省钱的服务 阿里云解决方案 一站式提供从公司注册到财税法等各项代办服务&#xff0c;高效透明&#xff0c;省时省心。 解决方案简介 公司注…

搭建网站的简单粗暴方法概述

作者&#xff1a;fearlazy个人主页&#xff1a;fearlazy.com 对于不懂网站的人来说想要搭建自己的网站还是比较 困难的。好在现在很多东西都可以用现成的&#xff0c;这使得我们要搭建一个网站的时间成本大大降低了。在这里我们使用阿里云服务器wampserverzblog的组合方式简…

记网站由http改为https的几个步骤

环境&#xff1a;centos7 apache 1.申请证书 最新申请证书请参考&#xff1a;https://www.fearlazy.com/index.php/post/315.html 下载证书&#xff1a; 根据自己的web服务器选择下载即可。 2.上传证书到服务器 可以在web服务器程序目录下创建一个目录存放证书 mkdir /et…

微服务接入oauth2_分分钟让自己的网站接入 GitHub 第三方登录功能

今日干货刚刚发表查看:66666回复:666公众号后台回复 ssm&#xff0c;免费获取松哥纯手敲的 SSM 框架学习干货。OAuth2 和小伙伴们已经聊了很多了&#xff0c;咱们来一个实际点的案例练练手。这里我才用 GitHub 来做第三方登录。为什么是 GitHub 呢&#xff1f;有两方面考虑&…

求导数(导数计算器)网站 Derivative Calculator

Derivative Calculator 比如求x的平方的导数, 输入pow(x, 2), 点击go. 点击go, 然后会生成如下结果&#xff0c;包括了响应的函数图形.

LaTex常用技巧7:常用网站(公式和表格编辑器)

本文记录了本人编辑LaTex表格和公式常用的网站&#xff1a; 表格编辑器公式编辑器表格编辑器 网站1&#xff1a; 表格 编辑和生成器 支持LaTex Markdown多种格式 跟Markdown LaTex csv sql等和表格相关的都可以在这个网站里面找到。TableConvert 网站2&#xff1a; Tables G…

一个包含简明教程的网站:cheat-sheets.org

你听过Cheat-Sheets.org吗&#xff1f;在这里可以看到各种简明教程&#xff0c;包含了大部分的编程语言&#xff0c;C、C#、Jave、Python、sql、html、css、matlab、qt、mfc、shell、R……甚至还有photoshop、illustrator各种快键键汇总&#xff0c;真的短小精悍&#xff01;&a…

科研英文写作常用网站【持续更新】

1. bing词典 https://www.bing.com/dict?FORMZ9LHS4 例句很丰富。还没有广告。 2.英语表达同义替换 2.1 https://kmcha.com/similar 2.2 https://synonym.wordhippo.com/ 2.3 https://www.powerthesaurus.org/

太强了?京东大咖10年经验汇总:亿级流量网站核心架构笔记

经历过“双11”和“618”的同学都知道&#xff0c;在大促时如何保证系统的高并发、高可用是非常重要的事情。因此在备战大促时&#xff0c;有些通用原则和经验可以帮助我们在遇到高并发时&#xff0c;构建更可用的系统&#xff0c;如限流、降级、水平扩展和隔离解耦等。通过这些…

服务器论坛有哪些_网站降权常见的处理方法都有哪些?

要说在网站优化过程中害怕出现的情况&#xff0c;降权就是其中的一个&#xff0c;要知道网站降权会导致网站流量大幅度下降&#xff0c;关键词排名消失等现象&#xff0c;那么大家是否了解网站降权常见的处理方法都有哪些吗?1.网站服务器的稳定性在网站优化的过程中大家都会了…

【技巧】用手机访问局域网内Apache网站

写在前面 之前不知道还有这么一个技巧&#xff0c;以前手机真机测试webApp都是开电脑的WiFi&#xff0c;然后在手机里开启代理来访问这个网站。这样对设备的依赖性比较大&#xff0c;试想哪天没带笔记本电脑&#xff0c;或者在没有WiFi发射器的台式机里怎么用这个方式&#xf…

网站备案地点选择_建设项目环境影响登记表(备案)操作指南 (汽修行业收藏版)...

汽修行业示例一、请在取得营业执照后按照以下步骤进行备案操作■1、打开上海市生态环境局网站(http://sthj.sh.gov.cn)&#xff0c;点击首页中部“网上办事大厅”■2、点击“建设项目环境影响登记表备案”下方的“在线办理”■3、认真阅读各项告知信息和《建设项目环境影响登记…

[软件测试] - No.5 Linux 下使用 xampp搭建ecshop网站

一、安装配置xampp 1. 在linux系统中&#xff0c;百度xampp&#xff0c;下载linux版本。下载并提取后的文件如图所示&#xff1a; 2. 在终端中执行 上述命令&#xff0c;启动xampp 安装界面&#xff0c;一直点击next至安装成功&#xff1a; 3.安装成功以后&#xff0c;切换到/…

搭建个人网站

许久没有更博了&#xff0c;当初开博的时候还是一个刚保研的大四学生&#xff0c;如今已是研究生毕业两年&#xff0c;混迹银行业的IT码农&#xff0c;生活还算如意&#xff0c;追求不止于此&#xff0c;2016年初终于发布了自己首个个人网站&#xff0c;写篇文章分享网站的技术…