闲聊—— 一个其他业务方对接的问题。

2021-01-13 10:39:37 +08:00
 luckylo
场景描述。
一个系统 A 的某个操作 需要通知到 系统 B 。

甲 :一定要等到 系统 B 返回 业务状态码 为成功,否则就需要重试 (原因:业务方处理失败,应该自行主动重试)。

乙 :通知 系统 B 的时候,只要 http 状态码 为 200,就不再重试。(原因:业务方处理失败,应该由业务方自己补偿)

对于这个,我个人支持 乙 。各位大佬发表下看法。
1882 次点击
所在节点    程序员
16 条回复
codespots
2021-01-13 10:44:12 +08:00
支持乙,主要是被调用方不可控,那可控的就只能是调用方了。
Biu0617
2021-01-13 10:55:43 +08:00
主要看业务,通知系统 B 的结果不重要的话就选用 乙方案,通知的结果比较重要就选甲方案并且要增加补推的机制。
Biu0617
2021-01-13 11:01:41 +08:00
举例
乙方案:微信支付(即系统 A )回调 /通知到 我们支付中心(系统 B ),微信会回调几次,支付中心无应答后也不会重试了。
甲方案:我们支付中心(此时作为系统 A ) 通知到我们具体的业务系统(系统 B ),要确保支付状态的通知能够通知到位,则会一直请求直到业务系统应答,并且增加监控和异常补推等功能。
wzzzx
2021-01-13 11:03:03 +08:00
你是说通知,通知的话只需要确保对方知道这个事就可以了
luckylo
2021-01-13 11:11:58 +08:00
@Biu0617 http 状态码是 200 了,肯定是通知到位了。B 业务处理失败,返回业务状态码失败,这个不是 A 需要关心的。 因为 B 的这个失败,可能就是 B 无需处理,所以失败。
还有就是,B 接到请求,在处理失败的时候,应该及时落库,如果需要重试处理的,也应该是 B 任务补偿而不是 A 继续通知。因为 A 根本不知道要不要继续通知
Biu0617
2021-01-13 11:19:01 +08:00
@luckylo 在理
qiayue
2021-01-13 11:20:02 +08:00
这个完全看文档如何定的,我们提供接口给平台回调,有些平台要求业务处理成功返回 http 码 200,不成功则返回其他错误码,当非 200 时,平台会重试,同一个数据最多回调 3 次,如果 3 次还不返回 200,由此带来的业务损失,由我们自己负责。

另一个平台则要求我们业务处理成功时返回 {"code":0},处理失败是返回 {"code":xxx} ,当返回 code 非 0 时,平台也会重试,也是最多回调 3 次。

你说这两个平台的处理方式有问题吗?
都没问题,都能解决业务需求。
eason1874
2021-01-13 11:23:11 +08:00
直接学支付宝、微信那些大平台的做法,那些是经过检验的。

要求系统 B 返回 success 表示通知到位,同步通知一次,没收到 success 就连续异步通知几次,间隔 4m 、10m 、10m 、1h 、2h 、6h 、15h 等等。

我不太相信状态码,会担心哪天业务逻辑错误,请求没进到实际模块直接返回了 200 状态。
yeqizhang
2021-01-13 11:41:17 +08:00
两个不能都做吗
zzh7982
2021-01-13 14:40:59 +08:00
直接发给消息队列不就完了么
haosamax
2021-01-13 15:18:28 +08:00
一般支付平台的回调都是甲这种方案
byzf
2021-01-14 02:58:12 +08:00
实际情况里要反馈一下失败的,不反馈失败让用户自己猜失败原因吗。。。那你要反馈一个失败必然不能只靠 200 。
luckylo
2021-01-14 07:52:13 +08:00
@byzf 对方 200 证明拿到请求了。既然拿到请求,幂等 补偿不应该是对方自己的事?
luckylo
2021-01-14 07:54:06 +08:00
@byzf 0 成功,1 失败,2 无需处理,那我还需要判断这个干嘛?失败原因是啥,我还需要根据 N 多原因判断?没这说法吧?
luckylo
2021-01-14 07:55:31 +08:00
@byzf 要是对方 一个 NPE,导致失败了,我傻乎乎的重试?这本就是对方补偿的事吧
byzf
2021-01-14 15:30:39 +08:00
@luckylo 重试不重试也是业务需求。这个我也不知道啥叫傻乎乎,一般支付回调如果失败都是要重发的,不管是我去接别的大平台还是别人来接我公司的小平台,而且配置错误的各种可能中会返回一个 200 的状态码是很常见的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744454

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX