1、问题分析
灰度发布时,订单工程会起两个工程,假设order-v1简称v1,为正式工程,order-v2简称v2,为灰度工程,后面均以此定义。现在有这样一种情况:当有v2工程有订购类接口被调用时,工程会请求mop,然后mop下发mq消息B,消息B无法区分接受方是v1还是v2工程,此时就会存在抢消息现象,导致消息无法被发送消息的工程消费,导致订单出错。
抢消息示意图
2、改造方案
可以参考现有的灰度发布的方式,通过ingress中userid来区分是访问v1还是v2工程。所以,考虑给在mop发送过来的消息中加上userid信息,在下发至工程前,通过feign调用订单工程的方式,并在请求头中塞入userid,再经过ha至ingress分流,最后到对应的工程,及v1消费消息A,v2消费消息B,互不影响。具体流程如下:
改造后流量走向
3、改造相关代码
/*
Feign调用代码
**/
@FeignClient(name = "order",
fallbackFactory = OrderClientFallbackFactory.class,
path = "/orderpath",
url = "url")
public interface OrderClient {
@PostMapping(value = "/book")
@ApiOperation(value = "订购实例")
ReturnMessage<Boolean> createInstance(
@RequestHeader(REQUEST_ID) String requestId,
@RequestHeader(USER_ID) String userId,
@RequestBody CreateReq createReq,
@RequestParam(req2) String req2);
}
/*
Controller
**/
@RestController
@RequestMapping(value = "/orderpath/book")
public class Controller {
@PostMapping(value = "/book")
public ReturnMessage<Boolean> createInstance(@RequestBody CreateReq createReq,
@RequestParam String req2) {
//dosomething
}
}