低成本打造一个带宽无限的网站(四)

news/2024/5/14 3:29:14/文章来源:https://blog.csdn.net/weixin_33704591/article/details/90336040

分块处理

上一篇曾提到,我们可对资源加密存储,然后在 SW 中进行解密。

理论上这当然可行,但事实上会出现一些问题:我们必须等整个资源下载完成后,才能开始解密操作。这对于用户体验,会产生很大的影响。

假如有个 1MB 的图片,通过 100 KB/s 的速度加载,那么要 10 秒后才能解密再展示;然而正常情况下,图片是边加载边显示的,并不会让用户等很久,然后一次性展示所有的。

为了解决这个问题,一个期待已久的新标准终于到来,那就是 Stream API。

有了流的支持,数据就可以渐进处理,而不必等待完整的。例如,我们使用 fetch 分块读取内容:

// fetch 分块读取演示
async function load(url) {let res = await fetch(url);console.log('response:', res);let reader = res.body.getReader();for (;;) {let r = await reader.read();if (r.done) {break;}console.log('chunk:', r.value);}console.log('end');
}load('https://raw.githubusercontent.com/EtherDream/_/master/pic.jpg');

演示:codepen.io/anon/pen/zPKrGX

同时,SW 也支持数据分块输出给下游:

// SW 分块输出
let stream = new ReadableStream({async pull(controller) {let chunk = read_from_upstream()controller.enqueue(chunk)if (is_done) {controller.close()}},
});let res = new Response(stream, ...);
...

两者结合,我们就可以实现边下载、边解密、边输出的效果。于是对于加密的图片、视频等资源,也能循序渐进地展示了!

下载加速

除了解密、解压缩等场合,数据流还可用于传输优化。例如,用户下载大文件的场合。

由于免费空间单个节点的带宽是有限的,因此下载速度不会太快。这时就可以通过 SW 做加速了 —— 我们同时从多个节点获取相应的文件片段,然后依次输出到响应流里:

boost.svg

在用户看来,这只是浏览器默认的单线程下载,但事实上内部已通过 SW 加速,和传统的多线程下载软件并无本质区别!

当然,就算免费空间不支持 Range 请求也没关系,我们可事先把大文件分成多个小文件上传,然后分别加载即可。

动态加速

上一篇提到,通过 SW 可对故障节点「实时无缝」的切换。现在有了数据流,我们可将其发挥到极致,甚至能在传输的过程中进行调整。

例如,SW 默认选择 节点 1 加载资源,但发现速度没有预期的那么快,于是可增加 节点 2 参与加速:

proxy.svg

这样,我们就能根据用户的实际网络情况,在端上动态调整,从而实现更智能的负载均衡!

插入脚本

有时候,我们希望给站点下所有页面的头部插入一个 JS 脚本。

这个功能,如果没有数据流支持的话,那么 SW 必须得下载整个 HTML 才能修改;而现在,我们只需改造最先返回的几个 chunk 即可!

inject.svg)

不过需要注意的是,chunk 是二进制层面截断的,因此可能会把多字节字符截成两半,导致出现乱码。

为此,我们需要用「流模式」解码字符串。例如:

// stream decode example
// 你: 228, 189, 160
// 好: 229, 165, 189
let dec = new TextDecoder();
let chunk1 = new Uint8Array([228, 189, 160, 229, 165]);
let chunk2 = new Uint8Array([189]);dec.decode(chunk1, {stream: true});     // "你"
dec.decode(chunk2, {stream: true});     // "好"

如果 chunk 末尾的字符不完整,那么不足的部分则被暂存在内部,下次解码时会自动加在开头。

这样,我们就能用字符串方法,方便地操作二进制数据了:

let dec = new TextDecoder();
let enc = new TextEncoder();input.ondata = function(chunk) {// 二进制 -> 字符串let str = dec.decode(chunk, {stream: true});// 插入脚本元素str = str.replace(/<head/i, '<script ...><head');// 字符串 -> 二进制chunk = enc.encode(str);...
};

当然,这里的逻辑还有点瑕疵 —— 假如 <head 这个字符串正好跨越两个 chunk,那就无法匹配到了。

由于 JS 不支持流模式的正则匹配,因此这里可用个土办法:如果 str 匹配不到,则截掉末尾 5 个字符(即 <head 的长度),然后将截出来的尾巴暂存起来,留到下一次,拼到头部。。。

这样,虽然不怎么严格,但实现简单,并且也很高效!

此外,由于我们只需注入一次脚本,因此替换后即可跳过解码、匹配、编码这些步骤了。

小结

在数据流的配合下,SW 可实现非常丰富的玩法。不过目前只有 Chrome 浏览器支持 Stream API,因此兼容性也是个较大的问题。相信随着新标准的普及,今后使用前端加速的网站,一定会越来越多。

然而对于我们的「免费空间」来说,除了兼容性问题之外,还有 SW 的各种使用限制也是一个挑战。因此如何绕过 SW 的使用限制,也是需要我们思考的。

下一篇

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

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

相关文章

大型网站技术架构演化

一、大型网站软件系统的特点 1.高并发、大流量 a.什么是高并发? 高并发是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计保证系统能够同时并行处理多个请求。 b.高并发的衡量指标有哪些? (1)响应时间:系统对请求做出响应。例如系统…

搜索引擎排名都选乐云seo_seo网站优化百度排名首页360搜狗搜索引擎排名首页

最新活动&#xff1a;接网站排名首页&#xff0c;按照关键词计算&#xff0c;不接敏感词&#xff0c;不上首页不收费&#xff01;seo的用途&#xff1f;1seo概念Seo就是搜索引擎优化的缩写&#xff0c;也叫网站优化&#xff0c;主要作用就是针对于网站在搜索引擎的排名的一门技…

php末尾友链,与php程序员的笔记网站交换友链的原则

很抱歉&#xff0c;由于本网站首页友链已满&#xff0c;目前停止交换首页友链&#xff0c;内页仍可交换友链&#xff01;(2013年2月24日)随着本站友链的数量不断增多&#xff0c;本人不得不对本站的友链申请的原则进行郑重的申明一下&#xff0c;希望各位申请本站友链的站长们理…

C#队列Queue实现一个简单的电商网站秒杀程序

电商的秒杀和抢购&#xff0c;对程序员来说&#xff0c;都不是一个陌生的东西。然而&#xff0c;从技术的角度来说&#xff0c;这对于Web系统是一个巨大的考验。当一个Web系统&#xff0c;在一秒钟内收到数以万计甚至更多请求时&#xff0c;系统的优化和稳定至关重要。 我们直接…

千万pv网站架构之RabbitMQ

千万pv网站架构之RabbitMQ 简介 什么是RabbitMQ&#xff1f; MQ全称为Message Queue, 消息队列&#xff08;MQ&#xff09;是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息&#xff08;针对应用程序的数据&#xff09;来通信&#xff0c;而无需专用链接来…

ssm重新开发计科院新闻网站

本次的开发主要是套入SSM框架&#xff0c;并在前面的新闻网站的开发的基础上套入easyui的前段框架对新闻后台的增删改查的一个管理 但是实验完成过程中还有几个问题尚未解决 其一是上传新闻时&#xff0c;不能上传图片&#xff0c;这一问题在ueditor中可以进一步完善 其二在查看…

.NET使用ServerManager获取网站物理路径

最近因为工作需要&#xff0c;用wpf做了一个辅助小工具&#xff0c;如下图 为了获取网站的物理路径&#xff0c;我分析了通过ServerManager获取到的变量&#xff0c;也通过百度搜索了很多&#xff0c;但仍然没有找到方法。 后来使用必应&#xff0c;在国外网站找到了&#xff0…

Linux系统定时备份网站文件到七牛云存储脚本

1、七牛云账号注册。 有些朋友可能会问为什么要备份到七牛云&#xff1f;很简单&#xff0c;七牛云免费注册就能获取1G的存储空间&#xff0c;只要简单几步操作完成实名认证即可获取10G的存储空间&#xff0c;对于一般个人站点来说已经足够备份使用了。如果还没有七牛云存储空间…

WP的SEO工具汇总

Baidu Sitemap Generator 百度站点地图生成工具 https://wordpress.org/plugins/baidu-sitemap-generator/ This pulgin generates a Baidu XML-Sitemap for WordPress Blog. Also Build a real Static Sitemap-Page for all Search Engine. | 生成百度 Sitemap XML 文件。就相…

Mozilla Firefox 在用户访问被黑客攻击的网站时发出警告

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> Mozilla 正致力于 优化 Firefox Monitor 功能&#xff0c;该功能推出于 2018 年&#xff0c;目的是让用户确认他们的账户信息是否泄漏。目前&#xff0c;Mozilla 已经为 Firefox 用…

大数据教程(14.2)网站数据分析(二)

2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章介绍了网站点击流数据分析项目业务背景&#xff1b;本篇博客博主将继续分享网站分析的相关知识。 一、整体技术流程及架构 1.1.数据处理流程 该项目是一个纯粹的数据分析项目&#xff0c;其整体流程基本上就是…

Java 爬虫遇到需要登录的网站,该怎么办?

在做爬虫时&#xff0c;遇到需要登陆的问题也比较常见&#xff0c;比如写脚本抢票之类的&#xff0c;但凡需要个人信息的都需要登陆&#xff0c;对于这类问题主要有两种解决方式&#xff1a;一种方式是手动设置 cookie &#xff0c;就是先在网站上面登录&#xff0c;复制登陆后…

网站部署到Linux服务器上并添加https证书

用的是Nginx服务器 一、部署 将网站打包成war包 放到Linux的data/wwwroot/default目录 解压&#xff1a;jar -xvf novel.war 删除war包&#xff1a;rm novel.war 删除文件夹 &#xff1a;rm -rf novel 二、申请SSL证书 网站 &#xff1a;https://www.pianyissl.com/ 三、…

当网站遭遇DDOS攻击的解决方案及展望

当网站遭遇DDOS攻击的解决方案及展望一、事件发生春节长假刚过完&#xff0c;WEB就出现故障&#xff0c;下午1点吃完回来&#xff0c;立即将桌面解锁并习惯性的检查了Web服务器。通过Web服务器性能监视软件图像显示的向下滑行的红色曲线看到WEB出现问题了。根据上述的问题&…

基于WebSphere与Domino的电子商务网站构架分析

本文出自 “李晨光原创技术博客” 博客&#xff0c;谢绝转载&#xff01; 转载于:https://www.cnblogs.com/chenguang/p/3742340.html

随时查看源码的网站---http://www.sooset.com/

由于工作需要经常要在Windows平台下参阅linux源码&#xff0c;以前都用http://lxr.linux.no/来浏览源码&#xff08;如下图所示&#xff09;,最近发现sooset来浏览更方便&#xff0c;所以介绍给大家分享。导航栏用起来很方便&#xff0c;不是吗&#xff1f;呵呵更多详情请参考&…

大型网站架构之百万PV

一&#xff1a;百万PV架构概述PV(page view&#xff0c;页面浏览量)即点击量&#xff0c;通常是衡量一个网站受欢迎程度的主要指标。本案例采用四层模式实现&#xff0c;主要分为前端反向代理层、web层、数据库缓存层和数据库层。前端反向代理层采用主备模式&#xff0c;web层采…

网站及监控利器 Pandora FMS使用体验

Pandora FMS 是一个 开源的应用程序 &#xff0c;用来监测网站的各种活动,它可以收到实时的监测报告&#xff0c;并发送到你指定的邮箱&#xff0c;也可以通过e-mail&#xff0c; SMS 发送。 更多Linux下的监控软件请关注《Linux企业应用案例精解》一书本文出自 “李晨光原创技…

layui导入模板数据_大气漂亮美观的三个网站后台数据管理模板 大大提升你的开发效率...

今天整理了三个我做项目经常使用的三个网站后台模板&#xff0c;这三个模板都是开源的&#xff0c;可以下载商用&#xff0c;可基于它们开发任何网站&#xff0c;做为后台管理数据。这样能为你开发后台功能节约大量的时间。一.ok-admin 一个很赞的&#xff0c;扁平化风格的&…

Silverlight SEO(搜索引擎优化)白皮书

概要这份文档描述了一些Silverlight程序的搜索引擎优化&#xff08;SEO&#xff09;技巧。这些技巧是用来帮助开发人员使得Silverlight内容能够在搜索引擎的结果页被发现&#xff0c;并为没有激活Silverlight的用户提供合意的体验。这份文档将包括以下的章节&#xff1a;*介绍 …