客户端抢购活动的时间同步与倒计时设计

今天公司产品的一个需求,要在手机App上准点进行活动,于是有了下面这些想法。

需求描述与约束

假设我们要在手机App上进行一个抢购小米手机的活动,参与的用户同时开始,任何用户的误差要小于1秒。 活动一般是定在每周二上午十点开抢,但有周二可能节假日,或者要求更高,一小时前临时上活动,之后打开App的用户都可看到。

  1. 既然有不同时区的用户,内部存储和计算应该用全球统一的时间戳,展示时再转为北京时间。
  2. 用户可能修改手机时间,手机的时间一天下来可能有几秒误差,所以接近活动一段时间就要用倒计时。
  3. 活动快开始时要和服务器同步一次,但在线用户太多,不可能频繁地与服务器同步。

初步方案

  1. 和服务器同步时间步骤
    • App记录当前的本地时间戳start_time,向服务器发起请求;
    • Server将服务器的当前时间戳server_time和活动开始时间戳task_time返回;
    • App记录收到结果的本地时间戳stop_time;
  2. 计算同步时间,消除App和服务器间的时间误差
    • 和server_time对应的本地时间就是发出请求和收到结果的时间中间值
    local_time = start_time + (stop_time - start_time) / 2
* 活动启动的本地时间是
    launch_time = local_time + (task_time - server_time)
  1. 优化流程,减小误差,同时保证服务器承受的压力不大
    • 提前一小时采取本地倒计时,倒计时开始时间
    alarm_time = launch_time - 3600
* 活动开始前2、3分钟和服务器再同步一次时间,即进行一次上两步

再次同步时间,提前150秒
    resync_time = launch_time - 150

转载于:https://my.oschina.net/ryanliu/blog/707064

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值