[关闭]
@zhuchao941 2017-01-15T13:09:13.000000Z 字数 791 阅读 880

流量复制问题解决方案

现象

会有请求被重新发到服务端,请求参数完全一样(包括TOKEN和签名)
通过该请求的访问IP与骑手正常访问时的IP做对比后确认该请求并不是由骑手APP发出
但是请求头还是有不一样的,比如其中的User-Agent
Android上来的UA为:okhttp/2.5.0
iOS上来的UA为:Rider/4.3.0 (iPhone; iOS 10.1.1; Scale/3.00)
其余都是异常的UA,从nginx访问日志分析大致有如下:

AHC/1.0据Google是某爬虫默认的UA,该UA的请求已经都被运维封杀了

问题原因

  1. 之前做了TOKEN和签名校验,但是这种只能防止参数篡改。针对于一模一样的HTTP请求,无法识别请求的有效性。
  2. 某些请求暂时无法做到幂等,比如骑手上下线

解决方案

难点

上述的解决方案会存在一个问题:客户端和服务端时间信息可能存在不一致
针对这个问题,计划在骑手上传经纬度(15s一次)接口进行服务端时间的下发
那么客户端在上传经纬度正常的情况下和服务端的时间差最多15s
而服务端将有效期时间窗口设置成30s,也就是保证请求在发起30s之内才有效
这样对于被复制的流量只要超过30s就能被完全过滤掉

上线流程

总体按照解决方案来开发,但是初期上线服务端不验证有效期,通过日志形式打印出每个请求请求时和服务端的时间戳差值,分析出一个较为合理的有效期。最后再加上这个有效期的限制。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注