![](https://img-blog.csdnimg.cn/direct/c5d9e2ccdeb54e34a1a04f064f61801c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
rocketmq
文章平均质量分 89
rocketmq
zhifou123456
记录是为了更好的思考
展开
-
深度解析RocketMq源码-高可用存储组件(一) raft协议详解
所以在leader宕机过后,一定能够保证整个集群超过一半的节点拥有最新的日志,再结合投票时一定是半数以上的支持,才能当选leader,也即他的索引一定是大于等于集群半数以上节点的,所以一定有用最新的日志。前面的文章已经分析过,以前rocketmq通过主从复制的思想实现系统的高可用,即在搭建集群的时候会手动的设置一个主节点和从节点,在写入数据的时候,会先写入到主broker,然后再同步到从节点中。term是一个单调递增的数字,每次candidate在发起选举的时候,便会将当前的term增加1。原创 2024-06-23 18:22:13 · 878 阅读 · 0 评论 -
深度解析RocketMq源码-持久化组件(四) CommitLog
至此,rocketmq的核心持久化主键commitLog我们便已经全部分析完成,简单而言,commitLog持有一个messageFileQueue,而mappedFileQueue对应不同的mappedFile文件,而mappedFile通过mmap技术与磁盘中的文件建立映射。原创 2024-06-20 21:40:00 · 745 阅读 · 1 评论 -
深度解析RocketMq源码-持久化组件(二) MappedFileQueue
在获取到最后一块mappedfile的时候,可以根据needcreate参数判断:如果超过内存范围,是否需要重新构建一个mappedfile。//重要,根据起始偏移量获取到最后一块mappedfile,并且根据needcreate参数判断如果超过内存范围,是否需要重新构建一个mappedfile//获取到mappedfilequeue中的最后一个mappedfile//如果最后一块mappedfile为空,表示此时为初始化,获取到新的mapperfile的起始位置。原创 2024-06-16 19:06:29 · 537 阅读 · 1 评论 -
深度解析RocketMq源码-Namesrv
前面几篇文章已经介绍了rocketmq的架构,如何使用以及生产上问题如何解决。接下来几篇文章将会介绍rocketmq的源码,我们在看问题的时候,会带着我们的问题去代码找答案,同时在代码中学习一些常见的代码技巧。接下来,我们先来探究一下NameSrv的源码。1.NameSrv之间是相互通信的吗?从上面源码分析,可以看出namesrv之间是没有通信的。2.NameSrv是如何存储topic的路由信息的?原创 2024-05-27 22:48:24 · 1149 阅读 · 3 评论 -
深度解析RocketMq源码-持久化组件(一) MappedFile
mappedFile本质上是利用mapp技术来提高读写效率的,而mappedFile的核心本质上就是mappedFileBuffer,默认大小为1G,可以由mappedFileSizeCommitLog来进行控制。原创 2024-06-15 12:25:58 · 936 阅读 · 1 评论 -
深度解析RocketMq源码-持久化组件(三) 刷盘策略
同步刷盘主要是在发送刷盘请求过后,会同步等待刷盘结果,这是它不会丢数据的根本原因。异步刷盘有两种模式定时模式和实时模式。实时模式就是数据写入后立刻刷盘,但是调用线程并不会阻塞等待刷盘结果;定时模式就是会启动一个线程每过500ms写入数据,这样做可以增大一次刷盘的条数,减少磁盘IO。原创 2024-06-18 00:13:08 · 1047 阅读 · 1 评论 -
RocketMq生产常见问题及解决方案(三) 顺序消息和消息堆积的解决法方式
而在订单业务常见的一个场景是,每个订单有下单->支付->发货这已操作,需要通过mq同步给第三方,我们在同步的时候需要保证每个单据内这三个操作是有序的就行,这就是局部有序消息。订阅关系不一致导致消息堆积,在rocketmq中,同一个消费者组,应该订阅的topic和tag信息应该是一模一样的,即消费者组在rocketmq中是作为一个基本单位存在的。我么有一次发生的问题就是,有一个灰度和非灰度环境,在配置的时候,灰度环境和非灰度环境都属于一个消费者组,但是消费的topic不一样,导致消费者不能消费。原创 2024-06-06 21:32:40 · 220 阅读 · 4 评论 -
RocketMq生产常见问题及解决方案(二) 重复消费产生原因以及解决方式
保证消息不被重复消费的主要解决方案主要是保证消费者端的幂等性。主要解决思路是更加messageId作为未Id,保证它的唯一性。所以我们可以用redis或者mysql的唯一索引来存储messageId,当消费的时候根据messageId查询一下redis或者mysql,如果查到有数据,表示已经被重复消费。在插入数据的时候我们也可以采用分布式锁防止并发插入问题。原创 2024-06-06 01:28:22 · 747 阅读 · 2 评论 -
RocketMq生产常见问题及解决方案(一) 如何保证消息不丢失
4.如果commit或者rollback消息发送失败,此时业务流程已经执行成功,mq会启动一个定时任务检查未被消费的half消息,并且回调业务方,判断这个half消息是应该回滚还是提交。答案是否定的,以保证消费者一定消费为例,当消息者一直没有消费成功的时候,rocketmq的消费者会进行重试,当超过16次过后,会加入到死信队列,这个时候,我们可以启动一个定时任务去扫描死信队列的内容,做对应的逻辑处理。将推送到mq消息和本地事务放到同一个事务中,并且如果失败,便多次重试,如果多次重试未果,便回滚事务。原创 2024-06-06 01:03:14 · 605 阅读 · 1 评论 -
RocketMq架构以及基本使用
messageQueue是真正存储消息的地方,其实在rocketMq里面,消息是顺序存储到不同文本文件里面的,这些文本文件就是commitLog,并且在存储的时候,会针对里面不同的topic建立不同的索引,这些索引就是consumeQueue,所以消费者在消费的时候,是根据consumeQueue获取到自己在commitLog中的索引位置,然后找到真正需要消费的数据,所以这里consumeQueue其实就是messageQueue。比如秒杀场景,如果不引入消息中间件,可能让请求压力直接给到数据库。原创 2024-04-15 22:31:24 · 447 阅读 · 4 评论 -
RocketMQ的使用
rocketmq对于使用者来说,我们只需要关心如何推送各种不同类型的消息,以及如何消费各种类型的消息即可。原创 2024-04-17 22:48:15 · 1037 阅读 · 3 评论 -
深度解析RocketMq源码-远程通信组件
rocketmq的各个组件之间的通信都是用rocketmq-remoting这个组件实现,而这个组件底层采用的是netty来进行通信的,所以学习这个组件我们可以学到netty的使用。在介绍这个组件之前,我们来了解一下什么是netty。NettyRemotingAbstract的主要作用是接收Netty的请求,根据请求找到一个响应或者请求的processor,然后调用对应的客户端实现的processor来处理结果。/***///oneway请求的信号量,通过它来控制同时发送oneway请求的并发数。原创 2024-05-24 00:36:46 · 711 阅读 · 2 评论