最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

秒杀活动中倒计时存在误差的问题

编程开发 4617浏览 4评论

做过电子商务的朋友都知道,用户对秒杀活动中开始的时间点非常敏感,如果因为时间误差导致用户没有秒到,不免会带来骂声一片,即时可能只是1秒的误差。那么时间误差究竟是怎么产生的?下面先说明下客户端倒计时的实现,再分析一下哪里产生的误差。

秒杀活动中的倒计时演示

秒杀活动中的倒计时演示

倒计时的实现

实现的方式也非常简单,因为客户端的时间是不可靠的,所以当前的时间必须要从服务器获取,这点是没有疑问的。而后根据服务器返回的系统时间和活动的开始时间做一个差值,最后开始倒计时。

这样的实现看起来非常完美,完全没有问题。但是在实际的应用当中,当把几台手机设备摆在一起的时候,问题就出现了:有的手机快一些,有的手机慢一些。这个问题最早还是用户发现的,用户比较疯狂,想用几个手机一起抢东西,结果就发现了这个问题,暴汗啊。

误差产生的分析

先分析一下从获取系统时间到显示倒计时这样的一个过程。

  1. 客户端请求系统时间
  2. 系统响应完成
  3. 服务器网络传输时间数据到客户端
  4. 客户端根据活动开始时间和系统时间做倒计时显示

在系统响应刚刚完成的时候,这个时候时间和系统时间最为接近,可以说是相等的。但是经过网络传输这步后,误差就开始产生了,用GO语言测试从北京取回数据到厦门网络好一点的时候几十毫秒,差一点几百毫秒,这个误差不算小了。

在客户端取到系统时间后,又要经过很多处理,最后才显示出来,这样几百毫秒又过去了。经过观察我们发现iphone 4总是会比iphone 5,iphone 5s倒计时慢些,估计就和设备的性能有关系。

网络传输的时间和显示倒计时的时间加在一起,误差就不小了,肉眼能识别出来了。

解决办法分析

主要思路是要计算出网络传输的时间和渲染代码的执行时间,最近将系统时间加上这边的两个时间,再补上一个常量。

当前系统时间 = 服务器系统时间+网络传输时间+渲染时间+常量(可选)

在执行过程中,必然有无法计算到的时间部分,可以用常量补差,这个常量我估算在10ms内。

关于实现方面,网络传输时间还没想到方法计算,渲染时间还是比较容易,只要执行的开始结尾处设定开始和结束时间就可以计算出来。

转载请注明:快乐编程 » 秒杀活动中倒计时存在误差的问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (4)

  1. 这个问题已经非常细了,误差无法避免,不过最好能统一不同客户端的方法,倒计时显示一样就不会有大问题了。
    上帝大手3年前 (2014-08-02)回复
    • 陈杰斌
      也是,客户端的时间比服务器慢一些是正常的,在不同设备上看起来一致就行了。
      陈杰斌3年前 (2014-08-02)回复
  2. 你可以在服务端计算好差值,然后把这个差值结果用作倒计时,然后在客户端进行倒计时显示,这样无论是开始时间和结束时间都是使用的服务器时间,那就准确的多。
    life2年前 (2015-06-10)回复
    • 陈杰斌
      服务端计算差值,这个思路是?
      陈杰斌2年前 (2015-07-03)回复