1、消息发送问题分析
为了方便大家理解,我们以日常生活中的订单服务来进行原理的说明。当我们支付订单之后,我们账户的购物积分也会进行相应的积分调整。我们结合下面的订单服务、RocketMQ
、积分服务的简化交互图来看下,如果没有事务消息,这样的服务间交互有没有问题。
可能有的童鞋会说,这不是很简单嘛,肯定是订单服务先执行本地事务,更新订单信息。然后再发消息到MQ中,积分服务消费消息更新积分啊。但是事实上并没有这么简单。
如果我们订单服务直接更新的了订单信息并进行持久化,而后在发送订单信息到MQ
中。如果此时MQ
服务不可用,消息发送报错,无法将订单消息发到MQ
中,也就意味着积分服务不能收到订单信息,也就不会进行相应的积分操作。此时就会出现订单信息与积分信息数据不一致的问题。那么RocketMQ
是怎么解决这个问题的呢?
2、半消息
实际上RocketMQ
提供了一种half
消息的机制,订单服务发送half
消息到MQ
中,这个half
消息是不被消费者所见的。怎么理解这个half
信息呢,按照我自己的理解,就是它实现了一半的消息功能,只在生产端可见,在消费端不可见。那么这个half
消息是怎么实现在MQ
中不被积分服务所见的呢?
订单服务发送half
消息,并不是将消息投递到积分服务订阅的topic
,而是将消息投递到RocketMQ
中的RMQ_SYS_TRANS_HALF_TOPIC
对应的messeageQueue
。由于积分服务并没有订阅这个Topic
,所以这个消息对于积分服务是不可见的。
另外有个OP_TOPIC
用于记录对应half
消息的commit/rollback
状态。大致的交互如下如所示:
3、事务消息流程
交代完一些背景知识之后,我们来具体分析下事务消息的流程。订单服务先发送half
消息到MQ
中,相当于检查下此时RocketMQ
是否可用。如果此时half
消息可以正常发送到MQ
中,订单服务可以收到响应。此时订单服务可以进行本地事务处理,更新订单信息。同时订单服务提供事务执行结果的接口用于RocketMQ
进行回调。
如果订单服务half
消息发送失败了,由于网络原因或者MQ挂了,那么此时需要执行一些回滚操作,让订单进行关闭。因为订单信息无法通知到下游服务了。
最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
00道真实出现过的经典代码面试题**。
[外链图片转存中…(img-NtywJfdo-1714443931205)]