抽取共享的MQ配置
将MQ配置抽取到Nacos中管理,微服务中直接使用共享配置。
改造下单功能
改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:
定义topic类型交换机,命名为
trade.topic
定义消息队列,命名为
cart.clear.queue
将
cart.clear.queue
与trade.topic
绑定,BindingKey
为order.create
下单成功时不再调用清理购物车接口,而是发送一条消息到
trade.topic
,发送消息的RoutingKey
为order.create
,消息内容是下单的具体商品、当前登录用户信息购物车服务监听
cart.clear.queue
队列,接收到消息后清理指定用户的购物车中的指定商品
登录信息传递优化
某些业务中,需要根据登录用户信息处理业务,而基于MQ的异步调用并不会传递登录用户信息。前面我们的做法比较麻烦,至少要做两件事:
消息发送者在消息体中传递登录用户
消费者获取消息体中的登录用户,处理业务
这样做不仅麻烦,而且编程体验也不统一,毕竟我们之前都是使用UserContext来获取用户。
大家思考一下:有没有更优雅的办法传输登录用户信息,让使用MQ的人无感知,依然采用UserContext来随时获取用户。
参考资料:
改造项目一
思考一下,项目一中的哪些业务可以由同步方式改为异步方式调用?试着改造一下。
举例:短信发送
在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。
但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。
此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。
因此,这里我们必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次
那么问题来了:
我们该如何确保MQ消息的可靠性?
如果真的发送失败,有没有其它的兜底方案?
这些问题,在今天的学习中都会找到答案。