# 《拼团交易平台系统》第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 接口实现类,提供回调接口服务。这个是模拟的其他的微服务,将来要提供的接口。