巧用域名发散,缓解单广告位并发请求限制

  最近后端前辈的带领下做一件“大事儿”,将原有的基于页面的广告请求改为行业内比较先进的单广告位请求。随之带来了好多未知的坑。多去一个页面只发出一个异步请求,现在要发出1*广告位数的请求,这一个页面50-110的请求数无论对于后台能否承接高并发还是前端对大量异步回调的处理,都是挑战。但是单广告位有事只能投放的先提条件,身为广告人,怎能不迈出这一步呢。

  这次我们就先看看其中一个坑。我的一个页面中有100 多个广告位,要在页面刚加载的时候,并发100个异步请求。首先服务端的压力就不小,前端同时并发这么多的请求也会有一系列的问题:

  1、大量的异步请求所带来的大量的回调,注意这些回调并不是按请求的顺序返回的;

  2、浏览器并发限制,浏览器针对同一个域名可并发的请求数量是有限的,平均下来是6个。很明显我这100多个广告位请求要分好多批出发啊?

                      

为什么要这么多的请求?

  一开始的时候我也在问这个问题,毕竟在做单广告位之前,我好不容易写了一个基于页面的广告展示代码(一个页面只有一个请求,包含这个页面所有需要展示的广告数据)。那时候风和日丽、岁月静好、大错不出、小错不少。后台仅仅提供有数据的广告位,我将他们按照业务逻辑展示。但是后端前辈的鸡汤太好喝加之确实这段时间一直有一些问题解决不了,就是我们的广告后台只是将广告定位到了页面,而没有定位到具体的广告位;广告后台需要针对具体的广告位惊醒智能投放;后台需要对页面上的所有广告数据惊醒一次打包,就不得不在广告后台加入页面的概念,这完全是为了应对现有的模式,理想中广告投放后台应该专注于用户画像和针对资源(广告位)的服务,而前端也不该直接对广告位进行处理。这样两端都去掉页面这一层才是更好的选择,同事这也是页内普遍公认的处理办法——“单广告位请求”(智能广告的基石)。

出问题了——异步回调,啥时候干活

  我们的广告逻辑要求一部分广告马上显示,这部分还好,回调就渲染;另一部分要求分好几批次展示,这我就要等这部分“贵族广告”都回来了在启动渲染。但是单广告位请求就不得不面临一个问题——丢包。如果发100个,回来99个,那我的99个还不展示了?这问题不难,相信你心中肯定有答案了,不就是设定一个“截至时间”吗,但是和下面问题混在一起就要多考虑一点了。

又出问题了——并发请求

  既然没有选择原地踏步,而是勇敢前行,就要踩坑。第一个问题就是太慢,100多个好几批要很长时间才回来,我后续的广告渲染要等多久?时间长了,能保证都回来,但用户体验太差;时间太短,体验好了,但是100多个请求来不及回来。看来这个“截止时间”不好定。

  最终业务方选择了用户体验,毕竟广告本就是异步渲染,在等要等多久啊!这样我就只有一条路了——“提速”,优化请求的耗时,能在截至时间内那会所有的请求。那么我们来看一下耗时由那些部分组成:

单一请求耗时=发出请求耗时+网络延时+服务器计算响应时间+网络延时

从上面来,网络不是我们能控制的、服务端也已经加上了两级缓存,看好像没有前端能优化的部分哈,但是这里仅仅是一个请求的耗时,100个旧不是这样了。100个请求并不是一口气都发出去,而是被浏览器限制住了。浏览器为了方式同一个域名下的并发请求过多,从而做了安全限制,一般允许同一域名同时发出6个请求,如果每一个请求的耗时固定,并且网络带宽正常,总的耗时应该取决于最后一个请求发出的时间:

  50个:                                                   100个

   

总耗时=最后一个请求的等待时间+单一请求耗时    

  通过demo我们可以看出50个请求总耗时391ms减去dom ready ,50个请求耗时 = 391 - 155 = 236ms;100个请求耗时 = 850 - 214 = 636ms

  单一请求,我优化不了,但我可以减少最后一个请求的等待时间。那么等待时间是由什么决定的呢?等待时间是由同域并发请求限制造成的。虽然域名收敛时后续请求可以利用长链接来减少开销,感觉会“快一点”,但是浏览器限制了并发请求数。如果我们走另一条路(域名发散)呢?经过我的测试发散后单广告位的并发请求数又明显提高,50个广告位2个域名,总耗时=259 - 157 = 102ms 减少56.7%。100个域名3个域名总耗时 = 428 - 256 = 172ms减少72.9%。当然这是理想环境下,优化率较高。观察上线效果,总耗时减少在30%-50%这个范围内。

50个                                100个

  

怎么(利用域名发散)做的?

  其实很简单,我们对同一个服务申请多个域名。换个名字,浏览器就分别限制了,两个域名不就并发12个了嘛!这样并发的多了,等待的就少了,自然最后一个请求的等待时间,就大幅减少。总耗时也就可控在用户体验上可接受的范围。

  开发和测试的时候我们通过绑hosts的方式让服务器IP 有好几个“外号”,当然上线的时候还是要麻烦运维同事部署到公网环境。

是不是域名越发散(越多)越好?

  当然不是的,我们刚才提到域名收敛有一个最大的好处就是:后续的请求可以利用第一次建立好的长链接来减小网络开销,从而“提速”。当我100个请求,10个域名,就要建立10次链接。开销也不小。我们在域名收敛和域名发散之间需要折中一下。当然我在实际开发中发现50个请求时4个域名就已经比3个的耗时长了,而且3个域名的总耗时不是很稳定。我最终决定根据广告位数量来判断使用几个域名。30个请求以下使用1个域名;70个请求以下使用2个域名;120以下使用3个域名。

总结:

  实际工作中网站优化的机会不多,优化过静态请求的同学一定都知道合并静态资源。其背后正是“域名收敛”的思想。但是一般网站合并静态资源后,刨除内容图片资源懒加载的数量,往往js、css、精灵图的总量往往不会太多而且通过按需加载,往往不会产生如此大的并发请求。像单广告位请求这高并发的应用场景还是不多见,我们利用域名收敛、发散这样的一些基础理论却解决复杂棘手的问题。想来无论外界对前端价值褒贬不一,做前端开发还是挺有意思的。

时间: 2024-08-02 02:51:44

巧用域名发散,缓解单广告位并发请求限制的相关文章

浅谈域名发散与域名收敛

性能优化一直是前端工作中十分重要的一环,都说从 10 到 1 容易,从 1 到 0 很难.而随着前端技术的飞速发展,没有什么技术或者法则是金科玉律一成不变的. 很佩服那些勇于挑战权威,推陈出新的勇者,是他们让我们的技术不断的变革更加的卓越.好像扯远了,本文主要想谈谈两个名词,域名发散和域名收敛.    域名发散 这个很好理解,前端er都知道,PC 时代为了突破浏览器的域名并发限制,遵循这样一条定律: · http 静态资源采用多个子域名 嗯,为什么要这样做呢,目的是充分利用现代浏览器的多线程并发

浏览器允许的并发请求资源数

一. 浏览器的并发请求数目限制是针对同一域名的.即,同一时间针对同一域名下的请求有一定数量限制.超过限制数目的请求会被阻塞. 不同浏览器这个限制的数目不一样: 二. 下边技术的出现和大量使用都和并发资源数有关. 1.Cookie-free domain 由于写在主域名下的cookie,如 xxx.com下的 cookie 比较大的情况下,若图片之类的 pic.xxx.com  图片去服务器取数据的时候,都需要发送本地的头,就会带上cookie,这样就会造成send数据过多,导致速度变慢像 js.

浏览器允许的并发请求资源数 优化

首先,是基于端口数量和线程切换开销的考虑,浏览器不可能无限量的并发请求,因此衍生出来了并发限制和HTTP/1.1的Keep alive. 所以,IE6/7在HTTP/1.1下的并发才2,但HTTP/1.0却是4. 而随着技术的发展,负载均衡和各类NoSQL的大量应用,基本已经足以应对C10K的问题. 但却并不是每个网站都懂得利用domain hash也就是多域名来加速访问.因此,新的浏览器加大了并发数的限制,但却仍控制在8以内. 后端:浏览器即使放弃保护自己,将所有请求一起发给服务器,也很可能会

探知 浏览器并发请求个数

起因:在工作中经常会发现浏览器请求过多,会很慢很卡,但我并不知道并发请求个数, 于是就写个例子,探知浏览器并发请求的个数. 思路:1.新建网站. 2.添加两个按钮,分别添加点击事件,请求不同接口. 3.服务端添加内容,打印当前时间的日志,并使进程sleep 10秒. 4.分别点击按钮,查看日志时间连续记录有几条,即为并发请求个数,间隔时间长的打印,即为下次排队执行的请求. html部分: 添加两个 <body> <input id="Button1" type=&qu

并发请求时网线如何传输数据?

很惭愧毕业10来年没做过一根网线,仔细端详了下网线接口,数了下8根线,看着水晶头一闪一闪陷入了深深的思考,就这几根线连接了我和你,让世界尽收眼底. 1.网线8根线什么作用? 双绞线一共八根线,布线规则是1236线有用,4578线闲置,其中13一组,26一组,一端的输出为另一端的输入 1输出(+),2输出(-),3输入(+),4保留,5保留,6输入(-),7保留,8保留 12发送信号,36接收信号 2.为什么输出和输入分别为两根,一正一负? 差分传输是一种信号传输的技术,区别于传统的一根信号线一根

【EBS】并发请求/请求集挂到菜单功能

并发请求/请求集挂到菜单功能 通常并发请求是通过点击菜单栏"查看"→"请求"来提交,通常为了操作方便,希望能像其他表单一样挂到菜单中. 定义功能时,选择"表单"标签页,表单字段选择"运行报表",参数字段填写如下内容: CONCURRENT_PROGRAM_NAME="CUX_XXXXXXXX" PROGRAM_APPL_SHORT_NAME="CUX" CONCURRENT_PROGRA

关于浏览器并发请求数的研究及优化

下面先看一下各个浏览器的并发请求数限制: 通过并发数的限制衍生了domain hash, cookie free. 按照普通设计,当网站cookie信息有1 KB.网站首页共150个资源时,用户在请求过程中需要发送150 KB的cookie信息,在512 Kbps的常见上行带宽下,需要长达3秒左右才能全部发送完毕. 尽管这个过程可以和页面下载不同资源的时间并发,但毕竟对速度造成了影响. 而且这些信息在js/css/images/flash等静态资源上,几乎是没有任何必要的. 解决方案是启用和主站

浏览器允许的并发请求资源数是什么意思?

这个问题药系统的回答,还需要从前后端两方面思考 这个问题实际上涉及非常多的考虑和因此而发生的优化技术: 首先,是基于端口数量和线程切换开销的考虑,浏览器不可能无限量的并发请求,因此衍生出来了并发限制和HTTP/1.1的Keep alive. 所以,IE6/7在HTTP/1.1下的并发才2,但HTTP/1.0却是4. 而随着技术的发展,负载均衡和各类NoSQL的大量应用,基本已经足以应对C10K的问题. 但却并不是每个网站都懂得利用domain hash也就是多域名来加速访问.因此,新的浏览器加大

IIS处理并发请求时出现的问题及解决

原文链接:http://www.cnblogs.com/hgamezoom/p/3082538.html 一个ASP.NET项目在部署到生产环境时,当用户并发量达到200左右时,IIS出现了明显的请求排队现象,发送的请求都进入等待,无法及时响应,系统基本处于不可用状态.因经验不足,花了很多时间精力解决这个问题,本文记录了我查找问题的过程和最后解决方案,供大家参考. 软硬件环境: IBM刀片服务器,Intel至强处理器,4物理核,16个逻辑核心,内存32G Windows Server2008 E