【阿里前端实习面试】秒杀活动与倒计时问题

这是今天在阿里前端实习二面时遇到的,提问者是玉伯,他的问题大意是:

双十一淘宝会有各种秒杀活动,后端如何获取前端的准确时间呢?这其中要考虑网络延迟和客户端时间可能不准确的因素

当时自己没怎么答好,回来之后搜了一些资料和在一些论坛提问,在ourcoder,zhihu,v2ex都收集到了很多回答,先暂时记录一下,自己也还没有理解透彻,如有错误,虚心求教。

参考: http://zhihu.com/question/28896402
 
  1. 首先我们要明确问题的应用场景,第一秒杀活动对时间的精确性要求是很高的,第二参与秒杀活动的客户端时间可能不准确,三是用户可能会不断刷新页面持续的发起请求
  2. 然后我们确定一下思路和需求,在秒杀开始前我们要做到客户端与服务器同步时间,秒杀开始后我们要处理客户端提交的队列确定谁成功
 
    一种思路是使用客户端时间,但是每次进入页面的时候去服务器校对时间,每隔一定时间校对一次。
 
    具体是由几次的clinetTime和serverTime通过计算来一定程度上消除网络延迟的影响
 
    另一种思路是不信任客户端时间,采用ajax获取返回的http报文头部所包含的由服务器脚本产生的时间戳,或者建立长连接判断时间
 1 <script type="text/javascript">

 2 var xhr=new XMLHttpRequest();

 3 xhr.open('get','file.txt',true);

 4 xhr.onreadystatechange=function(){

 5      if(xhr.readystatechange==3){ //3表示interractive状态,就已经可以获取http头部内容

 6           var header=xhr.getAllReasponseHeader();

 7           alert('header');

 8           alert(xhr.getAllReasponseHeader('Date'));

 9      }

10 }

11 xhr.send(null);

12 </script>

 

还有一些其他的问题,前端倒计时一般用js的setInterval(func,time)函数来实现,第一个参数是函数名,第二个参数是时间,这个函数的功能是每隔time(ms)执行一次func函数,然而这里有一个问题,func函数每一次执行的时间依赖于当前的cpu和硬件环境,这是会造成一定误差的,如果需要更高精确度,需要与后端进行沟通,优化setInterval()函数。
另外涉及到大量请求,参考此博文: https://github.com/fwon/blog/issues/13

你可能感兴趣的:(倒计时)