景
如上图,互联网企业的国内业务肯定部署在国内,出海业务则一般部署在海外;具体部署区域,则一般根据用户所在区域,选择就近的区域。
源站部署到不同区域,选择不同的机房,对于各地用户来说,会带来网络距离及网络线路质量的差异,从而对用户的访问响应时间也会产生一定差异。
网络距离长及网络线路质量差,则会给用户带来比较差的体验,具体情况概括如下:
那么,下文介绍的就是我们常见的网络加速方法。
ps:因为是要介绍的技术是通用技术,各家公有云都有自己的产品,所以在下文的介绍中,我为了避免重复的画图及描述,引用了各家公有云的文档,在下文中有对应标示。
静态加速
静态加速,我们听过最多的就是CDN,而且一般用的是CDN的静态文件缓存加速功能。
CDN加速的核心就是就近访问缓存:
CDN的加速原理(引用阿里云官网文档):
阿里云CDN产品架构图,其他公有云产品架构图差不多。
节点分布(引用华为云官网文档)
cdn加速类型(引用华为云官网文档)
大文件下载加速
点播加速
web1.0时代,网站大部分是静态内容,所以最开始的静态加速就能满足需求;随着web2.0及移动互联网时代的到来,网站中的动态请求占比逐渐提升。
那如果动态内容请求慢,是否有加速的办法了?答案是有的,那就是动态加速。
如下图,因为动态内容如果加了缓存,那么用户访问到的就不是最新的内容;
所以动态请求一般不做缓存加速的方案,而是通过优化边缘节点到源站的回源链路的方式来加速;
cdn静态缓存加速的边缘节点一般是通过公网线路回源到源站;
动态加速网络会把动态加速网络中的所有边缘节点互联成一个私有网络;
动态加速就是用户就近访问到边缘节点后,通过这个私有网络,智能选择一条最优质量的线路回源,保证回源过程不会受到公网网络的不确定因素的影响的方式来进行动态请求的加速;同时这个私有网络也会进行一些长链接等协议优化的方式来加速。
ps:
全站加速,其实就是同时具备静态加速和动态加速的能力。
CDN初代产品具有的能力就是静态加速,随着升级支持动态加速的功能,就变成了全站加速。
不同的云厂商产品规划不同,有些云厂商会把全站加速单独拿出来作为一个产品,有些云厂商则把全站加速集成到了CDN产品中。
全站加速的过程如下图:
ps:不同云厂商的动态加速计费方式和静态加速计费方式可能不一样,需要注意计费方式不同带来的成本不同的问题。
图片来自华为云:
全球加速核心和全站加速中的动态加速的原理类似,大概如下:
应用场景(图片来自华为云):
作者 | 邹永红 高级SRE专家
来源-微信公众号:微鲤技术团队
出处:https://mp.weixin.qq.com/s/mRshh-NjlkvsYd5f7dDPoA
. 使用内容分发网络 (CDN)
内容交付网络是分布在不同地理位置的一组 Web 服务器,这些服务器根据最终用户的位置向其提供 Web 内容。当您在单个服务器上托管网站时,所有用户请求都将发送到同一硬件。因此,处理每个请求所需的时间会增加。最重要的是,当用户物理上远离服务器时,加载时间会增加。使用 CDN,用户请求将重定向到最近的服务器。因此,内容可以更快地交付给用户,网站可以更快地工作。这是一种相当昂贵但非常有效地优化加载时间的方法。
2.将您的网站移动到更好的主机
有三种可能的托管类型:
共享主机
虚拟专用服务器(VPS)托管
专用服务器
世界各地最常用的托管类型是共享托管。这是在短时间内以低廉的费用使您的网站上线的最便宜的方式。选择快速Web主机以确保更好的优化至关重要。使用共享主机,您可以与也使用此服务器的其他站点共享 CPU、磁盘空间和 RAM。这就是共享主机不如VPS或专用服务器快的主要原因。
虚拟专用服务器和专用服务器要快得多。VPS使用多个服务器进行内容分发。拥有VPS,您可以与其他用户共享服务器,并拥有自己的虚拟服务器部分,您的配置不会影响其他客户端。如果您的网站具有平均流量,或者您的电子商务网站在某些时期具有流量高峰,则VPS将是您的最佳解决方案。
最昂贵的托管选项是使用专用服务器,该服务器可以是您自己的物理服务器。在这种情况下,您需要支付服务器租金并雇用系统管理员来维护它。
3.优化网站上图像的大小
每个人都喜欢引人注目的图像。在成功的电子商务网站的情况下,图像是至关重要的一部分。产品页面上的大量照片,图像,图形可以提高参与度。图像使用的消极方面是它们通常是大文件,会减慢网站的速度。
在不影响图像质量的情况下减小图像大小的最佳方法是使用ImageOptim,JPEGmini或Kraken等工具压缩图像。该过程可能需要一些时间,但这是值得的。减小图像大小的另一种方法是使用 HTML 响应式图像<机密>和<大小>属性,这些属性根据用户显示属性调整图像大小。
4. 减少插件数量
插件是每个网站的通用组件。它们添加了第三方建议的特定功能。不幸的是,安装的插件越多,运行它们所需的资源就越多。因此,网站运行速度较慢,并且还会出现安全问题。随着时间的流逝,插件的数量会增长,而其中一些插件可能不再使用。我们建议您检查已安装的所有插件并删除不必要的插件。首先,在您的页面上运行性能测试,以找出哪些插件正在减慢您的网站速度。网站速度不仅取决于安装插件的数量,还取决于它们的质量。尽量避免加载大量脚本和样式或生成大量数据库查询的插件。最好的解决方案是只保留必要的,并确保它们保持最新。
5. 尽量减少 JavaScript 和 CSS 文件的数量
如果您的网站包含大量JavaScript和CSS文件,则当您的网站访问者想要访问特定文件时,会导致大量HTTP请求。这些请求由访问者的浏览器单独处理,并减慢网站工作速度。如果你减少JavaScript和CSS文件的数量,这无疑会加快你的网站速度。尝试将所有JavaScript分组为一个,并对所有CSS文件进行分组。这将减少 HTTP 请求的总数。有很多工具可以快速缩小HTML,CSS和JavaScript文件。例如,您可以使用WillPeavy,Script Minifier或Grunt工具。
6. 使用网站缓存
如果有很多用户一次访问页面,服务器工作缓慢,需要更多时间才能将网页交付给每个用户。缓存是将网站的当前版本存储在主机上并显示此版本直到网站更新的过程。这意味着网页不会为每个用户一遍又一遍地呈现。缓存的网页不需要每次都发送数据库请求。
网站缓存的方法取决于开发网站的平台。例如,对于WordPress,您可以使用以下插件:W3 Total Cache或W3 Super Cache。如果您使用VPS或专用服务器,您还可以在常规设置下设置缓存。对于共享服务器,网站缓存通常不可用。
7. 实施 Gzip 压缩
Gzip压缩是减小文件大小的有效方法。它最大限度地减少了HTTP请求并减少了服务器响应时间。Gzip 在将文件发送到浏览器之前会压缩文件。在用户端,浏览器解压缩文件并显示内容。此方法可以处理您网站上的所有文件。您可以通过添加一些代码行或通过名为gzip的实用程序在您的网站上启用Gzip。
8. 内容管理系统中的数据库优化
数据库优化是提高性能的有效方法。如果您使用包含复杂插件的内容管理系统(CMS),则数据库大小会增加,您的网站运行速度会变慢。例如,WordPress CMS存储评论,博客文章和其他占用大量数据存储的信息。每个CMS都需要自己的优化措施,并且还具有许多特定的插件。例如,对于WordPress,您可以考虑WP-Optimize。
9. 减少网页字体的使用
网页字体在网站设计中变得非常流行。不幸的是,使用Web字体会对页面呈现的速度产生负面影响。Web 字体向外部资源添加额外的 HTTP 请求。以下措施将帮助您减少网页字体流量的大小:
使用现代格式WOFF2用于现代浏览器;
仅包括网站上使用的字符集;
仅选择所需的样式
10. 检测 404 错误
404 错误表示“找不到页面”。当页面的访问内容不再存在时,托管将向浏览器或搜索引擎提供此消息。为了检测和更正404错误,您可以使用错误检测工具和插件。正如我们所提到的,其他插件可能会对您的网站速度产生负面影响,因此我们建议您通过外部工具运行资源以进行错误检测。例如,Xenu的Link侦探,Google Webmaster Tools(GWT)和404 RedirectEd Plugin For WordPress。
检测到所有 404 错误后,您需要评估它们生成的流量。如果这些死链接不再带来任何访问,因此永远不会消耗您的服务器资源,那么您可以保持原样。如果这些页面仍然有一些流量,请考虑为外部链接设置重定向并修复内部链接的链接地址。
11. 减少重定向
网站重定向会创建额外的 HTTP 请求,从而对性能产生负面影响。我们建议将它们保持在最低限度或完全消除它们。首先,您应该通过运行站点扫描来识别页面上的所有重定向。您可以使用尖叫青蛙快速识别重定向。然后,您必须检查它们是否用于必要的目的,并仅保留关键目的。
想在网页中实现实时音频变声效果该如何实现呢,之前遇到这种处理音视频的需求,可能会想到需要借助C代码实现。但是现在随着浏览器性能的提升、web API的丰富,通过浏览器原生的API也可以操作音频数据实现很多复杂的效果,为web音频开发提供了更多的选择。下面介绍几种采用原生Web Audio API实现变声效果的过程中尝试的几种方案,感兴趣的同学一起来了解下吧。
说明:本文讨论范围为变声场景中的变速变调方案,有其它两种场景:变速不变调、变调不变速需求的同学请移步参考链接或其它方案
开始之前先简单了解下Web Audio API,Web Audio API提供了一组在web上操作音频的API,可以使开发者自选音频数据来源,为音频添加效果,使声音可视化,为声音添加空间效果等功能。音频的输入流可以理解为一组buffer,来源可以是读取音频文件产生到内存中的AudioBufferSourceNode,也可以是来自HTML中audio标签的MediaElementAudioSourceNode,也可以是来自音频流(例如麦克风)的MediaStreamAudioSourceNode。例如,采集自己设备上的麦克风声音连接到扬声器:
// 创建音频上下文
const audioContext=new AudioContext();
// 获取设备麦克风流
stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
// 创建来自麦克风的流的声音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 将声音连接的扬声器
sourceNode.connect(audioContext.destination);
就可以对着麦克风说话听到自己的声音了。对上述来源数据流的处理被设计成一个个的节点(Node),具有模块化路由的特点,需要添加什么样的效果添加什么样的node,例如一个最常见的操作是通过把输入的采样数据放大来达到扩音器的作用(GainNode),示例代码:
// 创建音频上下文
const audioContext=new AudioContext();
// 创建一个增益Node
const gainNode=audioCtx.createGain();
// 获取设备麦克风流
stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
// 创建来自麦克风的流的声音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 将声音经过gainNode处理
sourceNode.connect(gainNode);
// 将声音连接的扬声器
gainNode.connect(audioContext.destination);
// 设置声音增益,放大声音
gainNode.gain.value=2.0;
以上只是连接了声音放大的node,如果想要增加其它效果,可以继续往上添加node连接connect,例如滤波器(BiquadFilterNode)、立体声控制(StereoPannerNode)、对信号进行扭曲(WaveShaperNode)等等。这种模块化设计提供了灵活的创建动态效果和复合音频的方法,是不是有种变魔法的感觉,哪里修改点哪里(添加Node)非常方便。例如,以下展示了一个利用 AudioContext 创建四项滤波器节点(Biquad filter node)的例子:
var audioCtx=new (window.AudioContext || window.webkitAudioContext)();
// 创建多个不同作用功能的node节点
var analyser=audioCtx.createAnalyser();
var distortion=audioCtx.createWaveShaper();
var gainNode=audioCtx.createGain();
var biquadFilter=audioCtx.createBiquadFilter();
var convolver=audioCtx.createConvolver();
// 将所有节点连接在一起
source=audioCtx.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(distortion);
distortion.connect(biquadFilter);
biquadFilter.connect(convolver);
convolver.connect(gainNode);
gainNode.connect(audioCtx.destination);
// 控制双二阶滤波器
biquadFilter.type="lowshelf";
biquadFilter.frequency.value=1000;
biquadFilter.gain.value=25;
可以看到为声音流添加处理效果就像穿项链一样,一个接一个,最后得到最终效果,实现效果可以参考官方样例voice-change-o-matic。一个简单而典型的 web audio 流程如下:
首先回顾一下声音的基础知识,声音是由物体振动产生的机械波,常接触到的有以下三个特性:
这里说的变声效果是改变声音的音调,变声效果根据不同的场景可以分为变速不变调、变调不变速以及变调又变速 3 种。变速是指把一个语音在时域上拉长或缩短,而声音的采样率、基频以及共振峰都没有发生变化。变调是指把语音的基因频率降低或升高,共振峰做出相应的改变,采样频率不变。各种方案应用场景如下:
前两种实现都要求对声音知识领域有更深的了解,声音时域、频域,信号的傅里叶变换变化都要去重新去复习一下,学习成本比较高,这里使用第3种方式,比较好接入。要改变声音的播放速率,Web Audio API中提供了AudioBufferSourceNode有playbackRate属性,可以设置音频的播放速率,使用音频上下文AudioContext.createBufferSource获得实例,示例代码如下:
const play=()=> {
const audioSrc=ref("src/assets/sample_orig.mp3")
const url=audioSrc.value
const request=new XMLHttpRequest()
request.open('GET', url, true)
request.responseType='arraybuffer'
request.onload=function() {
const audioData=request.response
const audioCtx=new (window.AudioContext || window.webkitAudioContext)();
audioCtx.decodeAudioData(audioData, (audioBuffer)=> {
let source=audioCtx.createBufferSource();
source.buffer=audioBuffer;
// 改变声音播放速率,2倍播放
source.playbackRate.value=2;
source.connect(audioCtx.destination);
source.start(0);
});
}
request.send()
}
可以调整source.playbackRate.value的值来改变音调,大于1提高音调,小于1降低音调。
虽然实现了变声效果,但是这种方式只适合播放音频文件,或者能获取到完整音频流的情况,对于获取麦克风这种持续输入的声音流并不适用,类似的还有SoundTouchJS,它是某大佬实现的SoundTouch的JS版本,使用也是要获取完整音频的数据流,作者也做了相应的解释,参考链接
如何处理麦克风获取的实时音频流呢,这里可以借助Web Audio API中的ScriptProcessorNode,它允许使用 JavaScript 生成、处理、分析音频。处理流程图如下:
利用它将实时音频流数据处理一下,得到慢放或加速的声音流数据。示例代码如下:
const audioprocess=async ()=> {
const audioContext=new AudioContext();
// 采集麦克风输入声音流
let stream=await navigator.mediaDevices
.getUserMedia({ audio: true})
.catch(function (error) {
console.log(error);
});
const sourceNode=audioContext.createMediaStreamSource(stream);
const processor=audioContext.createScriptProcessor(4096, 1, 1);
processor.onaudioprocess=async event=> {
// 处理回调中拿到输入声音数据
const inputBuffer=event.inputBuffer;
// 创建新的输出源
const outputSource=audioContext.createMediaStreamDestination();
const audioBuffer=audioContext.createBufferSource();
audioBuffer.buffer=inputBuffer;
// 设置声音加粗,慢放0.7倍
audioBuffer.playbackRate.value=0.7
audioBuffer.connect(outputSource);
audioBuffer.start();
// 返回新的 MediaStream
const newStream=outputSource.stream;
const node=audioContext.createMediaStreamSource(newStream)
// 连接到扬声器播放
node.connect(audioContext.destination)
};
// 添加处理节点
sourceNode.connect(processor);
processor.connect(audioContext.destination)
}
另外,还有一个利用Google开源jungle实现的改变音调的库,并且还有各种混响效果,音频可视化等炫酷功能,也是使用的Web Audio API实现,github链接地址放在这里了,有兴趣也可以体验下,画面长这样
以上就是对Web Audio API的简单介绍和使用的分析,以及采用Web Audio API实现声音简单变声效果的几种实现,大家有哪些更好的实现方案欢迎评论区一起交流!
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API
https://github.com/cwilso/Audio-Input-Effects
https://mdn.github.io/voice-change-o-matic/
https://github.com/cutterbl/SoundTouchJS
https://cloud.tencent.com/developer/news/818606
https://zhuanlan.zhihu.com/p/110278983
https://www.nxrte.com/jishu/3146.html
作者:付晓方
来源:微信公众号:奇舞精选
出处:https://mp.weixin.qq.com/s/MuBqhyDUWbqU9p8e9LhdlQ
*请认真填写需求信息,我们会在24小时内与您取得联系。