遇到的问题
最近项目中有这样一种场景:需要改变部分订单的结算方式,这个改动点对交易结算影响很大,需要逐步切流以减少风险。订单有buyerId(买家id)、sellerId(卖家id)、tkBizTag(订单打标)……几十个字段,如果case by case硬编码来限定切流的场景来做,就很不灵活,单纯这个切流就要上多次线。
因此有这样的技术需求:使用一种灵活多变的切流方式,即可支持对按照订单对象任何一个参数满足某种条件时进行切流,如按照订单类型字段、某些买家id符合要求。
解决方案
经过调研,最终采用aviator表达式+动态内容推送中间件(diamond)来实现。
一个简单的demo如下:
NCpsPaymentDTO paymentDTO = newNCpsPaymentDTO();
paymentDTO.setTkBizTag(5);
paymentDTO.setTbBuyerId(1234L);
ExtraInfo extraInfo = new ExtraInfo();
extraInfo.setEventId(1234567L);
HashMap paramMap= new HashMap();
paramMap.put("paymentDTO",paymentDTO);
paramMap.put("extraInfo",extraInfo);
String configInfo ="paymentDTO.tkBizTag == 5 && paymentDTO.tbBuyerId % 10000 <=2000 && extraInfo.even