中间件(三):MQ实现订单系统异步化改造

x33g5p2x  于11个月前 转载在 其他  
字(2.4k)|赞(0)|评价(0)|浏览(109)

1、优化1----复杂流程加MQ

订单系统仅仅会同步执行更新订单状态和扣减库存两个最关键的操作,因为一旦你支付成功,只要保证订单状态变为“已支付”,库存扣减掉,就可以保证核心数据不错乱。

  • 订单系统接着会发送一个订单支付的消息到RocketMQ中去
  • 积分系统会从RocketMQ里获取到消息,然后根据消息去累加积分
  • 营销系统会从RocketMQ里获取到消息然后发送优惠券
  • 推送系统会从RocketMQ里获取到消息然后推送短信
  • 仓储系统会从RocketMQ里获取到消息然后生产物流单核和发货单,去通知仓库管理员打包商品,准备交接给物流公司去发货。

举例:更新订单状态需要耗费30ms,调用库存服务的接口进行库存扣减需要耗费80ms,增加积分需要耗费50ms,派发优惠券需要耗费 60ms,发送短信需要耗费100ms(涉及与第三方短信系统交互,可能性能抖动会达到1秒+),通知发货需要耗费500ms(因为涉及到 跟第三方物流系统交互以及与仓库管理系统交互,比较耗费时间,而且可能会性能抖动达到1秒+)。

  • 如果没有进行架构改造,每次支付成功后都需要由订单系统调用大量的其他系统进行各种操作,可能一次订单核心链路的执行需要接近 1秒钟。
  • 而且如果第三方短信系统以及第三方物流系统出现性能抖动,那么可能一次核心流程几秒钟。
  • 但是现在经过上述改造过后,一旦你支付成功,实际上订单系统只需要更新订单状(30ms)+扣减库存(80ms)+发送订单消息到 RocketMQ(10ms),一共120ms就可以了 。

将订单核心流程的性能从1秒~几秒的情况优化到100ms+,可以实现10倍性能提升的效果。

2、什么叫做同步发送消息到RocketMQ?

所谓同步,意思就是你通过这行代码发送消息到MQ去,SendResult sendResult = producer.send(msg),然后你会卡在这里,代码 不能往下走了

你要一直等待MQ返回一个结果给你,你拿到了SendResult之后,接着你的代码才会继续往下走。
这个就是所谓的同步发送模式。

3、什么叫做异步发送消息到RocketMQ?

你把消息发送出去,然后上面的代码就直接往下走了,不会卡在这里等待MQ返回结果给你!

然后当MQ返回结果给你的时候,Producer会回调你的SendCallback里的函数,如果发送成功了就回调onSuccess函数,如果发送失败了就回调onExceptino函数。
这个就是所谓的异步发送,异步的意思就是你发送消息的时候不会卡在上面那行代码等待MQ返回结果给你,会继续执行下面的别的代 码,当MQ返回结果给你的时候,会回调你的函数!

4、什么叫做发送单向消息到RocketMQ?

还有一种发送消息的方法,叫做发送单向消息,就是用下面的代码来发送消息:

这个sendOneway的意思,就是你发送一个消息给MQ,然后代码就往下走了,根本不会关注MQ有没有返回结果给你,你也不需要MQ返回的结果,无论发送的消息是成功还是失败,都不关你的事。

5、优化2---大数据大SQL

5.1、大SQL执行

大数据团队的BI系统每天都会直接在订单数据库里执行上百次几百行的大SQL,而每次一个几百行大SQL的执行都需要耗时几秒到十几秒不等。
每次这样一个几百行的大SQL执行,都会导致MySQL数据库服务器的资源负载急剧抖动,会让CPU、内存、磁盘IO的负载都瞬间升高。 而一旦MySQL数据库的资源负载瞬间升高,会导致订单系统在MySQL数据库上执行的SQL语句性能出现急剧下降,因此会导致订单系统的性能也出现抖动。

完全可以由订单系统将订单数据推送到一个MQ里,然后大数据团队从MQ里获取订单数据,接着将订单数据落地到自己的存储中去 。

比如最简单的办法,就是将订单数据落地到大数据团队自己的一个MySQL数据库中,然后从自己的MySQL数据库里统计报表。


5.2、如何将完整的订单数据发送到RocketMQ里去?

注意:之前是将支付成功的订单数据发到MQ,而大数据团队需要所有数据。故需要想办法将完整的订单数据都发送到RocketMQ里去,然后让大数据团队去获取。

MySQL Binlog同步系统:监听MySQL数据库的Binlog(MySQL的增删改操作日志),然后MySQL Binlog同步系统会将监听到的MySQL Binlog(也就是增删改操作日志)发送给你的系统,让你来处理这些增删改操作日志。目前不少成熟的开源技术方案的,比如阿里开源的Canal,以及Linkedin开源的Databus,都可以监听MySQL Binlog,然后将MySQL Binlog发送给你的系统,交给你去处理。

方案:采用Canal监听MySQL Binlog,然后直接发送到RocketMQ里 ,然后大数据团队的数据同步系统从RocketMQ中获取到MySQL Binlog,也就获取到了订单数据库的增删改操作,接着把增删改操作还 原到自己的数据库中去就可以。

好处:就是由订单技术团队将完整的订单数据库的MySQL Binlog推送到RocketMQ里,无论是大数据团队,还是未来公司的其他技术团队,比如说开放平台团队,人工智能团队,等等,只要想要订单数据,都可以直接从这个RocketMQ里去获取完整的订单数据。实际上大数据团队并没有必要仅仅只通过MySQL来出数据报表,完全可以采用Hadoop、Spark、Flink等大数据技术来出数据报表。

总结:

就是用Canal、Databus这样的MySQL Binlog同步系统,监听订单数据库的binlog发送到RocketMQ里然后大数据团队的数据同步系统从RocketMQ里获取订单数据的增删改binlog日志,还原到自己的数据存储中去,可以是自己的数据库,或者是Hadoop之类的大数据生态技术。
然后大数据团队将完整的订单数据还原到自己的数据存储中,就可以根据自己的技术能力去出数据报表了,不会再影响订单系统的数据 库了。

相关文章