# 《拼团交易平台系统》第2-14节:拼团回调通知任务
作者:小傅哥
博客:https://bugstack.cn (opens new window)
视频:https://t.zsxq.com/ysSyW (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!😄
大家好,我是技术UP主小傅哥。
# 一、本章诉求
在微服务设计中,当一个微服务系统的流程结束后,要通知下一个微服务系统。这个通知的过程,可以是 RPC、MQ,也可以是 HTTP 方式。
RPC、MQ,这一类的都是需要有一个公用的注册中心,它的技术架构比较适合于公司内部的统一系统使用。如果是有和外部其他系统的对接,通常我们会使用 HTTP 这样统一标准协议的接口进行使用。
那么,本章节要为拼团组队交易结算完结后,实现一个回调通知的任务处理。告知另外的微服务系统可以进行后续的流程了。
注意:微信支付,支付宝支付,也是在完成支付后,做的这样的回调处理。
# 二、业务流程
如图,拼团结算组队完成,回调通知;

- 首先,本节的重点在拼团成团后,实现回调通知流程。回调的过程,需要在用户锁单时需要增加一个回调的地址,并在拼团完结后发起回调。
- 那么,这里的一些功能改造点;
group_buy_order
在设计的时候有一个notify_url
回调地址,本节我们修改库表添加上这个字段。并对工程中的dao&po&mapper
操作,增加notify_url
字段。- MarketTradeController 营销交易服务,lockMarketPayOrder 锁单接口入参对象,增加 notifyUrl 回调地址。并有 PayDiscountEntity 对象透传到
TradeRepository#lockMarketPayOrder
仓储操作。这样写到group_buy_order
表就有回调地址了,等做回调操作的时候,就可以把这个地址写入到回调任务表中。 TradeSettlementOrderService#settlementMarketPayOrder
结算服务,需要把锁单记录中的 notify_url 拿到,放到 GroupBuyTeamEntity 中,这样在写入 notify_task 表记录的时候就可以把 notify_url 一起写入进去了。- 基于 okhttp 框架,封装对 http 接口的调用。用于处理调用外部其他微服务,实现回调通知的处理。因为外部的接口是随着每个服务调用拼团写入进来的 http 请求地址,所以在封装这部分调用的时候,要允许动态透传请求地址。实现类写到 infrastructure 基础设置层的 gateway 调用外部网关层。实现类;
GroupBuyNotifyService
提供方法;groupBuyNotify
- 在交易结算服务类 ITradeSettlementOrderService,定义执行结算回调通知接口,包括;
execSettlementNotifyJob()、execSettlementNotifyJob(String teamId)
一个是有入参的,一个无入参。这样可以指定给某个拼团队伍做结算。结算的过程就是调用GroupBuyNotifyService#groupBuyNotify
完成回调通知,并根据返回的结果更新 notify_task 表状态记录(成功、失败、重试),并记录回调次数,小于5次的时候都可以继续回调。 - 回调通知,可以分为两个阶段处理。一个是拼团完成后立即执行,另外一个任务补偿。立即执行是为了提供时效性,但因为远程的 http 调用受网络和服务的影响可能会失败,所以要增加一个任务补偿来做定时检查。其中立即执行在
TradeSettlementOrderService#settlementMarketPayOrder -> settlementMarketPayOrder
处理。另外定时任务在GroupBuyNotifyJob
处理。 - 测试接口,
trigger/http
下,增加TestApiClientController
接口实现类,提供回调接口服务。这个是模拟的其他的微服务,将来要提供的接口。