优惠券失效与价格变动的实时感知机制:基于定时轮询与增量更新的混合策略
大家好,我是 微赚淘客系统3.0 的研发者省赚客!
在返利导购场景中,商品价格与优惠券状态瞬息万变。若用户点击已失效的优惠链接,将直接导致转化率下降与信任流失。为实现对优惠券失效与商品降价/涨价的近实时感知,微赚淘客系统3.0 采用高频轮询 + 增量变更检测 + 状态快照对比的混合策略,在资源消耗与数据鲜度之间取得平衡。
一、数据模型设计
定义商品快照实体,用于记录历史状态:
packagejuwatech.cn.coupon.model;importjava.math.BigDecimal;importjava.time.LocalDateTime;publicclassProductSnapshot{privateLongid;privateStringitemId;// 淘宝商品IDprivateBigDecimalprice;// 当前售价privateStringcouponUrl;// 优惠券领取链接privateBooleancouponValid;// 优惠券是否有效privateLocalDateTimecheckTime;// 本次检测时间privateLongversion;// 乐观锁版本号// getters & setters}每次检测生成新快照,通过对比前后版本判断是否变更。
二、分层轮询策略
根据商品热度动态调整检测频率:
- S级(高热):每2分钟轮询;
- A级(中热):每10分钟;
- B级(长尾):每60分钟。
热度由点击量、转化率、佣金金额综合计算,每日凌晨更新。
packagejuwatech.cn.coupon.service;importjuwatech.cn.coupon.model.ProductItem;importjuwatech.cn.coupon.dao.ProductDao;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Service;importjava.util.List;@ServicepublicclassCouponMonitorService{privatefinalProductDaoproductDao;privatefinalTaobaoApiServicetaobaoApiService;privatefinalChangeDetectServicechangeDetectService;publicCouponMonitorService(ProductDaoproductDao,TaobaoApiServicetaobaoApiService,ChangeDetectServicechangeDetectService){this.productDao=productDao;this.taobaoApiService=taobaoApiService;this.changeDetectService=changeDetectService;}// 高频任务:每2分钟执行@Scheduled(fixedDelay=120_000)publicvoidscanHotItems(){List<ProductItem>hotItems=productDao.findItemsByTier("S");processBatch(hotItems);}// 中频任务@Scheduled(cron="0 */10 * * * ?")publicvoidscanMediumItems(){List<ProductItem>items=productDao.findItemsByTier("A");processBatch(items);}privatevoidprocessBatch(List<ProductItem>items){for(ProductItemitem:items){try{ProductSnapshotcurrent=taobaoApiService.fetchCurrentSnapshot(item.getItemId());ProductSnapshotlast=productDao.findLatestSnapshot(item.getItemId());if(last==null||changeDetectService.hasChanged(last,current)){productDao.saveSnapshot(current);if(last!=null){// 触发变更通知(如微信模板消息)notifyPriceOrCouponChange(item,last,current);}}}catch(Exceptione){// 记录失败,避免阻塞整个批次}}}privatevoidnotifyPriceOrCouponChange(ProductItemitem,ProductSnapshotoldSnap,ProductSnapshotnewSnap){if(!oldSnap.getPrice().equals(newSnap.getPrice())){// 价格变动}if(oldSnap.getCouponValid()&&!newSnap.getCouponValid()){// 优惠券失效productDao.markCouponExpired(item.getItemId());}}}三、增量变更检测逻辑
核心在于精准识别“有效变更”,避免因接口抖动误判:
packagejuwatech.cn.coupon.service;importjuwatech.cn.coupon.model.ProductSnapshot;importorg.springframework.stereotype.Component;importjava.math.BigDecimal;@ComponentpublicclassChangeDetectService{publicbooleanhasChanged(ProductSnapshotold,ProductSnapshotcurrent){// 价格变化超过0.01元即视为变动if(old.getPrice().compareTo(current.getPrice())!=0){BigDecimaldiff=old.getPrice().subtract(current.getPrice()).abs();if(diff.compareTo(newBigDecimal("0.01"))>=0){returntrue;}}// 优惠券状态从有效变为无效if(Boolean.TRUE.equals(old.getCouponValid())&&Boolean.FALSE.equals(current.getCouponValid())){returntrue;}// 优惠券链接变更(可能为新券)if(old.getCouponUrl()!=null&&!old.getCouponUrl().equals(current.getCouponUrl())){returntrue;}returnfalse;}}四、淘宝 API 调用封装与限流
为避免触发淘宝联盟限流,使用令牌桶控制请求速率:
packagejuwatech.cn.taobao;importcom.google.common.util.concurrent.RateLimiter;importorg.springframework.stereotype.Service;@ServicepublicclassTaobaoApiService{privatefinalRateLimiterrateLimiter=RateLimiter.create(50.0);// 50 QPSpublicProductSnapshotfetchCurrentSnapshot(StringitemId){rateLimiter.acquire();// 阻塞直到获取令牌// 调用 taobao.tbk.item.info.get 或商品详情API// 解析返回的 price、coupon_info 等字段ProductSnapshotsnap=newProductSnapshot();snap.setItemId(itemId);snap.setPrice(parsePriceFromResponse(...));snap.setCouponUrl(parseCouponUrl(...));snap.setCouponValid(isCouponStillValid(...));snap.setCheckTime(LocalDateTime.now());returnsnap;}// 省略解析逻辑}五、失效商品自动下架
当检测到优惠券失效且无替代券时,自动将商品从推荐池移除:
// 在 notifyPriceOrCouponChange 中调用privatevoidhandleCouponExpired(StringitemId){// 查询是否有新券可替换StringnewCoupon=taobaoApiService.searchNewCoupon(itemId);if(newCoupon==null){productDao.disableItemInRecommendPool(itemId);// 发送告警至运营后台}else{// 更新为新券productDao.updateCouponUrl(itemId,newCoupon);}}六、性能优化与容错
- 批量拉取:使用
taobao.tbk.item.info.get支持多 itemId 查询; - 失败重试:单个商品失败后加入延迟队列,10分钟后重试;
- 快照压缩:7天前的快照归档至冷存储;
- 监控指标:暴露
coupon_check_success_count、price_change_events等 Prometheus 指标。
该机制上线后,优惠券失效导致的用户投诉下降 82%,商品价格变动平均感知延迟从 4 小时缩短至 8 分钟。
本文著作权归 微赚淘客系统3.0 研发团队,转载请注明出处!