订单技术推送方案

laixiansheng 发布于 2019/12/23 09:28
阅读 2K+
收藏 2

#### 问题

有一个需求是这样的。假设我有一个订单系统,订单有状态A、B、C........等等很多个状态。需求来了,有一个合作伙伴系统和我们做一个订单接口对接,如果订单到了某一个状态(合作伙伴可配置)的时候给合作伙伴推送该订单的状态以及数据(需要的数据列可以配置)。请教一个这样的需求改怎么设计合理?

#### 目前的解决方案

一个推送表,订单状态改变的时候往这个表里面插入数据,定时器扫描这个表去做推送。以下是我个人的解决方案,还请教各路大神帮忙指点一二或者您有更好的实现方式

1. 业务数据改变的时候检查状态,有订阅往推送表插入数据(改动大,拓展性不好)

2. mybatis 拦截器,拦截update和insert 检查当前数据是否有订阅状态,有推送表插入数据。这个方案粒度太大,所有的表都被拦截了。(请教有没有针对表拦截)

3. aop 拦截mapper ,这个粒度比较细,但是用了mybatisplus不知道能不能实现

 

 

加载中
0
Joyzhou
Joyzhou

没用消息队列?这其实就是一个订单状态变动通知的消息

Joyzhou
Joyzhou
回复 @laixiansheng : 即使你不设计一下代码,订单状态变更也可以通过调用updateStatus统一实现。
骑着猪上高速
骑着猪上高速
回复 @laixiansheng : 用消息队列,数据表作异步持久化以及补偿方式去处理状态,定时任务只处理小量未同步的状态。
一道彩虹-两个背影
一道彩虹-两个背影
回复 @laixiansheng : mq不是有一个监听机制么?设置一个监听,如果监听到订单状态改变,那我就可以进行写队列
l
laixiansheng
有mq,问题点就是你在什么时候去出发写队列。其实队列和我插入推送表没有本质的区别,主要解决怎优雅的去处理状态触发
0
gaomq
gaomq

对方扔队列,然后你取就行了

枫叶leaf
回复 @laixiansheng : 可以不用同一个
魔力猫
魔力猫
回复 @laixiansheng : 你提供一个接口,然后做好网络安全,对方怎么调用用什么语言方法不用你管,只要这个接口接到的信息,你就放自己的队列。
l
laixiansheng
两个平台怎么不太可能用同一个mq的
0
S
Shingfi

你的方案 1 也是可行的。你的是支付订单通知吗?对方有回调吗?你要考虑推送次数的限制

l
laixiansheng
拓展性太差,订单状态改变的地方都要去处理这个插入逻辑。想全局,类似数据库触发器
0
b
ben202

看起来像推模式的消息通知,非常适合用MQ解决。订单系统为生产者,订单状态变动时发条消息进MQ,数据格式按你需要来。建一个消费者,负责监听队列及推送给合作伙伴。MQ保证了消息的不丢失,消息体写时间戳,消费者作幂等性及时序性处理(MQ本身也可以保证,看你用哪个),订单系统也可以和推送给关联系统的服务解耦。

l
laixiansheng
可能我想要的是什么时候去做这个事情。例如数据库的触发器,这个节点状态改变的去做这个事情
0
kakai
kakai
消息队列的发布订阅功能,你们这边订单状态改变后发布消息,客户那边订阅状态变更就行了。
kakai
kakai
回复 @laixiansheng : 订单状态数量应该是可控的,可预估的,每一处状态发布mq消息的工作量应该很小,总比日志埋点要简单很多。如果仍然觉得麻烦,可以试试使用状态机管理订单状态,在订单状态发生改变时由状态机统一处理,网上也有现成的文章介绍状态机在订单中的应用。
l
laixiansheng
问题来了,订单很多状态,不能每一处代码都去发布mq消息
0
0
David257
David257

根本就不是消息队列不队列的问题,问题点在于如何以最小的成本监控到订单状态发生了变动,写队列还是写表那都无所谓

l
laixiansheng
对的,不是队列的问题。问题点是在什么时候去做这个事情最优雅。可能我问题描述的不是很清楚
0
Codermecn
Codermecn

看你的意思好像是现在代码里很多更新订单状态的代码,把更新订单做成一个通用方法不就行了吗,在这个方法里触发通知

Mr_李QAQ
Mr_李QAQ
对的,针对订单状态变更,做一个通用方法,在修改为某个状态的时候只做一处处理(MQ也好,写库也好)就可以了。
5
51Amarantine
是的,这才是问题的根本。
0
自由PHP
自由PHP

考虑太多了,你想想支付宝、微信支付后是怎么通知你的,无非就是一个http回调而已,所以单纯的http restfull就够了。可以直接写钩子,钩子去异步处理是否有合作伙伴订阅状态,有的话就发起http推送。这样双方开发人员开发、沟通、服务器成本都是最低的

dingdayu
dingdayu
这样是可以的,但是要求接收方接口实现幂等,和无序处理。
0
BekeyChao
BekeyChao

定时任务查询数据库吧,处理方案是最low的,但是最简单,根据业务需求定轮询时间;

最好的方法还是在订单状态改变的地方加入钩子

返回顶部
顶部