写 DB 和发送下游消息要放到一个事务里面吗
資深大佬 : rihkddd 5
业务中经常有这种需求,比如新增一个订单,需要发 mq 消息到下游系统。看到把这两个操作放到一个事务的写法,那么这么做能达到这么写的目的吗(写数据 /发消息符合事务的四个特性)?
个人总觉得这么写是有问题的,但是说不出根本的问题点是什么。大家这种需求一般是怎么实现的?
大佬有話說 (19)
业务中经常有这种需求,比如新增一个订单,需要发 mq 消息到下游系统。看到把这两个操作放到一个事务的写法,那么这么做能达到这么写的目的吗(写数据 /发消息符合事务的四个特性)?
个人总觉得这么写是有问题的,但是说不出根本的问题点是什么。大家这种需求一般是怎么实现的?
还有什么本地消息表之类的,用数据库事务保证
问题是性能受影响,下游需要幂等 多余的服务开销 但是做肯定是做的到的
biz_code();
insertMessage();
callback();
end;
callback 方案可以使用 spring 事务机制进行回调
function callback(){//异步 or 同步
var rtn = sendMqMessage();
If(rtn){
delMessage();
}
}
对于 callback 发送失败问题,会有定时任务去消息表里面获取未成功发送的消息进行重试,在一定次数还为成功的消息,报警人工干预。
“`
写库,发送消息,调用支付,要放到一个事务里面。
否则你写了库也是脏数据,没有人回去消费他