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

由于工作较忙,随性更新。admin@stgod.com

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

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

秒杀活动倒计时例子

倒计时的实现

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

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

误差产生的分析

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

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

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

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

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

解决办法分析

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

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

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

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

 

转载请注明出处:https://stgod.com/1878/

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: