RocketMQ
文章平均质量分 88
RocketMQ应用及源码解析
Java识堂
这个作者很懒,什么都没留下…
展开
-
RocketMQ源码解析:消息丢失如何排查?
RocketMQ如何消费消息?RocketMQ消费消息RocketMQ消息丢失常用排查套路消息丢失导致数据不一致public enum TrackType { CONSUMED, CONSUMED_BUT_FILTERED, PULL, NOT_CONSUME_YET, NOT_ONLINE, UNKNOWN}类型解释CONSUMED消息已经被消费CONSUMED_BUT_FILTERED消息已经被投递且被过滤.原创 2022-03-20 16:30:18 · 5879 阅读 · 0 评论 -
RocketMQ源码解析:架构及特性一览
下载和安装wget https://mirror.bit.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-source-release.zipunzip rocketmq-all-4.7.1-source-release.zipcd rocketmq-all-4.7.1-source-release/mvn -Prelease-all -DskipTests clean install -Ucd distribution/target/rocketm原创 2020-07-16 12:54:18 · 1560 阅读 · 0 评论 -
RocketMQ源码解析:如何在IDEA中调试RocketMQ源码
配置RocketMQ运行时环境首先从github下载rocketmq源码:https://github.com/apache/rocketmq接着建一个RocketMQ运行时目录,/Users/peng/software/rocketmq(随意指定哈)。在这个目录下建3个文件夹,conf,logs,store。接着从源码的distribution/conf文件夹复制broker.conf,logback_namesrv.xml,logback_broker.xml文件到conf目录把logback.原创 2021-11-06 13:55:10 · 555 阅读 · 0 评论 -
RocketMQ源码解析:NameServer是如何存路由信息的?
NameServer的作用有哪些?NameServer其实就是一个注册中心。在分布式系统中为了避免单点故障,所有的应用都是以集群的形式提供服务的,RocketMQ也不例外。在RocketMQ中NameServer的具体作用如下Broker启动的时候会往所有的NameServer注册自己的信息,由此可以看出NameServer是一个CP系统,即放弃系统的一致性,保证可用性NameServer的路由关系都保存在RouteInfoManager中的4个map中,路由注册,路由删除和路由发现基本都是操.原创 2021-11-02 22:41:44 · 499 阅读 · 0 评论 -
RocketMQ源码解析:消息发送流程
RocketMQ发送消息的三种方式在RocketMQ中发送消息的方式有如下三种,同步发送,异步发送和单向发送。其中前2中发送方式是可靠的,因为会有发送是否成功的应答,而单向发送只管发不管发送是否成功同步发送消息,用来发送比较重要的消息通知public class SyncProducer { public static void main(String[] args) throws Exception { // 实例化消息生产者Producer DefaultMQProd.原创 2021-11-07 15:43:48 · 425 阅读 · 0 评论 -
RocketMQ源码解析:RocketMQ是如何存储消息的?
Broker端使用到的文件我们先来看一下RocketMQ的消息存储流程,当消息发送到RocketMQ上时,会被顺序写入CommitLog文件,这样能保证消息存储的高性能和高吞吐量。但是消息是按照Topic来消费的,如果消费时从CommitLog上查找对应的消息时,会比较慢。为了提高消息消费的效率,RocketMQ会将Topic一样的消息放在ConsumerQueue中,每个ConsumerQueue又分为几个写队列,一个队列一个文件。假如创建一个名为TopicTest的topic,并创建4个写队列.原创 2021-11-06 18:15:08 · 671 阅读 · 0 评论 -
RocketMQ源码解析:高性能存储策略
Page Cache我们经常听到别人说RocketMQ读写都很快?当别人问你RocketMQ为什么这么快时,你能回答上来多少?我们今天就来聊聊这个问题在回答这个问题之前我们先回顾一下计算机内存管理方面的知识物理内存:内存条上的内存空间虚拟内存:计算机内存管理的一种技术,它使得应用程序认为它拥有连续的可用内存。而实际上他是被分隔成多个物理内存碎片,这些数据也有可能存在磁盘上,在需要时进行数据交换缺页中断:当程序试图访问虚拟内存中的页,但是这个页未被加载到物理内存时,就会发出中断,将相关的页从虚拟内.原创 2021-11-21 20:57:50 · 964 阅读 · 0 评论 -
RocketMQ源码解析:同步刷盘和异步刷盘的实现
同步刷盘在RocketMQ中有同步刷盘和异步刷盘两种方式刷盘方式优点缺点同步刷盘数据可靠性高,适用于金融等对数据可靠性要求高的场景性能比异步刷盘要低异步刷盘性能和吞吐量高Broker端异常关闭时,有少量消息丢失异步刷盘异步刷盘的方式有两种,第一种Mmap+PageCache(默认的异步刷盘方式),上面说到的同步刷盘也是这种机制,代码实现如下@Testpublic void writeCaseOne() throws Exception { F.原创 2021-11-28 21:33:05 · 2695 阅读 · 0 评论 -
RocketMQ源码解析:主从同步和读写分离实现
启动HAService图片来自RocketMQ的官微,对整个主从同步实现的过程概括的比较清晰,对着图说一下具体的流程master和slave端都会启动HAService,slave端的HAClient会和broker端的HAService建立连接master端的AcceptSocketService用来处理slave端的连接,并将连接封装成HAConnection,一个连接封装成一个HAConnection每个HAConnection会启动2个线程WriteSocketService和Read.原创 2021-12-01 14:08:31 · 610 阅读 · 0 评论 -
RocketMQ源码解析:如何快速查找消息?
消息查询介绍当我们使用MQ的时候,一个比较好的习惯就是把发送的消息和接收到的消息打印到日志中。当我们排查问题的时候就非常方便。例如B服务需要消费A服务发送的关闭订单的消息。如果一个订单迟迟未关闭,此时可能有三种情况A服务发送失败B服务消费失败B服务没有收到消息A服务发送失败可以通过日志快速确认。如果A服务发送成功,此时就可能根据消息的属性快速查找到具体的消息,看这条消息是否被对应的ConsumerGroup消费过,如果没消费此时说明B服务之类的配置可能有问题,导致没有收到消息。如果被消费.原创 2021-05-09 17:39:39 · 1139 阅读 · 0 评论 -
RocketMQ源码解析:消息拉取和消费流程
消息消费总览RocketMQ消息消费有两种模式,顺序消费和并发消费。顺序消费在工作中几乎没遇到过,所以就不分析这方面的源码了,单纯分析并发消费。并发消费实现MessageListenerConcurrently接口即可,顺序消费实现MessageListenerOrderly接口public class Consumer { public static void main(String[] args) throws InterruptedException, MQClientExcept.原创 2021-11-13 14:24:33 · 2389 阅读 · 0 评论 -
RocketMQ源码解析:消息过滤是如何实现的?
三种消息过滤方式RocketMQ的过滤方式主要分为如下2种,其中类模式过滤的方式会在RocketMQ 5.0.0版本中被移除,所以不进行详细分析根据Tag过滤public class TagFilterProducer { public static final String RPODUCER_GROUP_NAME = "tagFilterProducerGroup"; public static final String TOPIC_NAME = "tagFilterTopic.原创 2021-05-07 16:22:06 · 619 阅读 · 0 评论 -
RocketMQ源码解析:长轮询是如何实现的?
消费者消费很快在文章一开始,先抛出一个问题,如果消费端的消费进度赶上生产端的消费进度,那么RocketMQ是怎么处理的?前面的文章我们聊过RocketMQ是基于拉模式来实现消息消费的,消费端会不断的创建拉取任务(即使没有拉取到消息),这样就会造成Broker端的压力很大,Broker端该如何处理呢?源码解析拉取消息的请求会交给PullMessageProcessor来处理,当没有拉取到消息时,会将对应的请求封装成PullRequest并放到PullRequestHoldService的pullR.原创 2021-11-13 20:48:11 · 1608 阅读 · 0 评论 -
RocketMQ源码解析:消息消费失败后的重试逻辑
消息消费失败重新投递的流程我们接着消息消费的逻辑分析,当消费完成后会调用ConsumeMessageConcurrentlyService#processConsumeResult的方法处理消费的结果,如果消费失败,则会将消息再次发送到这条消息原来存储的broker为什么要将消息发送到原来存储的broker呢?因为重试的消息只会消息的基本信息,没有具体的消息体,需要重新从commitLog中获取原来的消息获得消息体// MQClientAPIImpl#consumerSendMessageBac.原创 2021-11-16 21:05:47 · 2446 阅读 · 0 评论 -
RocketMQ源码解析:延时消息是如何实现的?
使用场景当我们在电商平台购买一件物品,但是没有付款时,平台会把对应的库存减少,并在会在30分钟后关闭这个订单。如果30分钟内你没有付款,平台会自动关闭这个订单,此时对应的库存被释放出来。我们应该怎么在订单创建后30分钟后并且没有付款的情况下将这个订单关闭掉?不断的扫描数据库吗?扫库的时间间隔怎么确定?间隔太长,关闭订单的时间点不精确,间隔太短,数据库的压力又太大?此时我们就可以用到延时消息,订单没有支付发一个延时时间为30m的延时消息,30m过后系统就会收到这个消息,进而关闭订单RocketMQ.原创 2021-05-09 15:41:13 · 751 阅读 · 0 评论 -
RocketMQ源码解析:事务消息是如何实现的?
用RocketMQ事务消息实现分布式事务在分布式系统中为了保证数据的一致性,通常要使用分布式事务。分布式事务的解决方案有很多,比如TCC,SAGA,今天我们就来看一下如何用RocketMQ事务消息实现分布式事务?RocketMQ实现分布式事务的流程如下producer向mq server发送一个半消息mq server将消息持久化成功后,向发送方确认消息已经发送成功,此时消息并不会被consumer消费producer开始执行本地事务逻辑producer根据本地事务执行结果向mq serv.原创 2021-11-09 10:56:15 · 1549 阅读 · 0 评论 -
RocketMQ 设计原理与最佳实践
介绍RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。RocketMQ 前身叫做MetaQ,在MetaQ发布3.0版本的时候改名为 RocketMQRocketMQ本质上的设计思路和Kafka类似,但是和Kafka不同的是其使用Java进行开发,由于在国内的Java受众群体远远多.转载 2021-05-06 23:31:00 · 733 阅读 · 0 评论 -
RocketMQ源码解析:消息发送和消费核心流程汇总
从上帝视角看一下消息发送和消费当我们使用RocketMQ时,RocketMQ-Dashboard是一个非常好用的图形化界面工具我们首先在RocketMQ-Dashboard上创建一个topic,每个topic下4个队列每个topic是一类消息的集合,topic下面再细分queue是为了提高消息消费的并发度当producer发送topic消息时,应该往topic下的哪个queue来发送呢?producer会采用轮询的策略发送那么consumer应该消费哪个queue下的消息呢?当有一个消费.原创 2022-03-19 19:05:45 · 2838 阅读 · 0 评论