最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
事务的概念就不用多说了,我相信阅读文章的童鞋都是有着非常深刻的认识。我们都知道MQ
可以实现微服务之间的异步以及解耦,那么引入MQ
之后,如何实现微服务之间的数据一致性是一个值得思考的问题。事务消息将分为三篇文章进行介绍,本文主要介绍RocketMQ
的事务原理,第二篇文章主要分析事务消息源码实现分析。在第三篇文章中将提供一种优化方案,解决RocketMQ
对于业务代码侵入较大的问题。
-
RocketMQ事务原理
-
总结
一、RocketMQ事务原理
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
状态。大致的交互如下如所示:
Java核心架构进阶知识点
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Java核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、Spring相关、分布式、微服务、RPC、网络、设计模式、MQ、Redis、MySQL、设计模式、负载均衡、算法、数据结构、kafka、ZK、集群等。而这些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的
内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补
资料的朋友,可以点击这里获取](https://bbs.youkuaiyun.com/forums/4f45ff00ff254613a03fab5e56a57acb)**