
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
消息队列机制是程序员在开发软件系统的时候需要应用到的一个功能,而今天我们就通过案例分析来了解一下,分布式软件开发消息队列应用。
1、MQ事务的意义
“发消息”过程,往往是为通知另外一个系统更新数据,MQ的“事务”,主要解决消息生产者和消息消费者的数据一致性问题。
用户在电商APP上购物时
先把商品加到购物车
然后几件商品一起下单
后支付
完成购物流程,就可以愉快地等待收货
该过程中有个需用MQ。
订单系统创建订单后,发消息给购物车模块,将已下单商品从购物车删除。
从购物车删除已下单商品步骤,并非用户下单支付这个主要流程的必需步骤,所以使用MQ异步清理购物车更合理。
订单模块创建订单的过程实际执行了俩操作:
在订单DB插一条订单数据,用来创建订单
发消息给MQ,消息内容即刚创建的订单
购物车模块订阅相应主题,接收订单创建的消息,然后清理购物车,在购物车中删除订单中的商品。
分布式下的这些步骤都有失败可能性,若不做处理,就可能导致订单数据与购物车数据不一致:
创建了订单,没有清理购物车
订单没创建成功,购物车里面的商品却被清了
因此问题
在任意步骤都可能失败时,要保证订单DB和购物车DB的数据一致性。
购物车系统收到订单创建成功消息清理购物车操作,只要成功执行购物车清理后再提交消费确认即可
如果失败,由于没有提交消费确认,MQ会自动重试。
问题关键点在订单系统,创建订单和发送消息不允许一个成功而另一个失败。
这就是事务问题。
2、分布式事务
单体关系型数据库都完整的实现ACID,但对分布式系统
严格实现ACID几乎不可能
或者说实现代价太大,大到无法接受
分布式系统在保证可用性和不严重牺牲性能的前提下,要实现数据一致性非常困难,所以出现很多“残血版”一致性,比如顺序一致性、终一致性。
所以分布式事务更多是在分布式系统中事务的不完整实现。在不同场景有不同实现,都是通过一些妥协解决问题。
常见分布式事务实现有2PC、TCC和事务消息。
每种实现都有其特定的使用场景,也有各自问题,都不是完美方案。
3、事务消息适用场景
主要是那些需要异步更新数据,并且对数据实时性要求不高。
比如在创建订单后,如果出现短暂几秒,购物车商品没被及时清空,也不是完全不可接受,只要终购物车的数据和订单数据保持一致。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。