abtest如何与nginx缓存共存

这是一个项目中的实际需求。

背景

电商会做秒杀商品,可能有很大的流量瞬间涌入到商品详情页。

为了应对这个峰值,以往是在nginx中对接口做一定时间的缓存,这样可以避免流量直接冲击后端的JAVA/PHP应用服务器。

但是后来商品详情接口为了优化产品而引入了若干的abtest实验,不同的用户可能看到不同的接口返回值,这时候nginx缓存就不能继续沿用了,该如何解决呢?

前提

虽然全站的abtest实验很多,但是商品详情页同时应用的abtest实验不会太多。

为了保证不同用户的接口缓存互不干扰,可以把商品详情页涉及的所有实验以及分流作为URL参数传递,这样nginx就可以根据URL存储不同分流情况下的缓存了。

方案

在abtest后台配置实验的时候,需要关联到”业务场景标签”,比如:某实验归属于商品详情接口(会影响接口的返回值),那么就给这个实验打上”product_detail”的标签。

客户端启动后请求abtest服务获取设备参与的实验列表时,abtest服务首先找出设备应该参与的所有实验,然后把实验按关联的标签聚合并拼接成abtoken。

比如:实验ID 113、140、151都关联到了product_detail标签,那么abtest返回一个这样的关系:product_detail=113_a,140_b,151_a,其表达了该设备在商品详情接口进行的所有实验与分流。

客户端请求商品详情接口时,找到product_detail标签关联的abtoken是113_a,140_b,151_a,拼接到接口URL中即可:/product/detail?abtoken=113_a,140_b,151_a。

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~