- 博客(32)
- 收藏
- 关注
原创 6、事务的completeTransactionAfterThrowing回滚、commitTransactionAfterReturning提交以及事务源码分析流程图
事务的completeTransactionAfterThrowing回滚、commitTransactionAfterReturning提交以及事务源码分析流程图。
2023-07-30 17:44:20
115
原创 5、createTransactionIfNecessary处理事务属性并尝试创建事务源码解析流程图
createTransactionIfNecessary处理事务属性并尝试创建事务源码解析流程图。
2023-07-30 17:43:13
62
原创 4、TransactionInterceptor事务拦截器与事务的AOP增强实现源码流程图
TransactionInterceptor事务拦截器与事务的AOP增强实现源码流程图。
2023-07-30 17:42:07
63
原创 3、BeanFactoryTransactionAttributeSourceAdvisor注解事务通知器源码流程图
BeanFactoryTransactionAttributeSourceAdvisor注解事务通知器源码流程图。
2023-07-30 17:40:35
46
原创 2、annotation-driven事务标签和@EnableTransactionManagement事务注解源码解析流程图
annotation-driven事务标签和@EnableTransactionManagement事务注解源码解析流程图。
2023-07-30 17:38:37
36
原创 17、DefaultMQPushConsumer消费者发起拉取消息请求源码
消息拉取由PullMessageService服务实现,PullMessageService继承了ServiceThread,因此他也是一个异步线程任务,将会在线程任务中,不断循环的从pullRequestQueue中阻塞式的获取并移除队列的头部数据,即拉取消息的请求,然后调用pullMessage方法根据该请求去broker拉取消息。MQClientAPIImpl的方法,首先构建构建请求命令对象,请求Code为PULL_MESSAGE,然后根据设置的消息拉取模式,调用不同的方法发起不同请求进行消息拉取。
2023-05-12 09:33:56
96
原创 16、RebalanceService消费者负载均衡过程源码
在通过AllocateMessageQueueStrategy#allocate的负载均衡算法为当前消费者分配了新的消息队列之后,需要调用updateProcessQueueTableInRebalance方法,更新新分配的消息队列的处理队列processQueueTable的信息,创建最初的pullRequest并分发给PullMessageService。这就是Push模式下最初的拉消息请求的来源。与平均分配策略差不多,区别就是分配的时候,按照消费者的顺序进行一轮一轮的分配,直到分配完所有消息队列。
2023-05-11 17:14:33
164
原创 15、消费者负载均衡服务RebalanceService入口源码
1、Broker收到心跳请求之后如果发现消息中有新的consumer连接,或者consumer订阅了新的topic,或者移除了topic的订阅, 则Broker发送Code为NOTIFY_CONSUMER_IDS_CHANGED的请求给该group下面的所有Consumer,要求进行一次负载均衡。更新此ConsumerGroup组对应的订阅信息集合,如果存在新增订阅的topic,或者移除了对于某个topic的订阅,那么需要通知当前ConsumerGroup的所有consumer进行重平衡。
2023-05-09 17:59:31
150
原创 14、消费者DefaultMQPushConsumer启动主要流程源码
1、调用checkConfig方法检查消费者的配置信息,如果consumerGroup为空,或者长度大于255个字符,或者包含非法字符(正常的匹配模式为 ^[%|a-zA-Z0-9_-]+$),或者消费者组名为默认组名DEFAULT_CONSUMER,或者messageModel为空,或者consumeFromWhere为空,或者consumeTimestamp为空,或者allocateMessageQueueStrategy为空……等等属性的空校验,满足以上任意条件都校验不通过抛出异常。
2023-05-09 15:46:28
329
原创 13、Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析
对于非事务消息或者是事务commit消息,则调用DefaultMessageStore#putMessagePositionInfo方法写入消息位置信息到consumeQueue,如果是事务prepared消息或者是事务rollback消息,则不进行处理。该方法用于将数据追加到MappedFile,这里仅仅是追加到对应的mappedByteBuffer中,基于mmap技术仅仅是将数据写入pageCache中,并没有立即刷盘,而是依靠操作系统判断刷盘,这样保证了写入的高性能。支持重试,最大重试30次。
2023-05-08 18:00:25
95
原创 12、Broker 消息重放服务ReputMessageService源码解析
3、如果broker角色不是SLAVE,并且支持长轮询,并且消息送达的监听器不为null,那么通过该监听器的arriving方法触发调用pullRequestHoldService的pullRequestHoldService方法,即唤醒挂起的拉取消息请求,表示有新的消息落盘,可以进行拉取了。1、如果重放偏移量reputFromOffset小于commitlog的最小物理偏移量,那么设置为commitlog的最小物理偏移量,如果重放偏移量小于commitlog的最大物理偏移量,那么循环重放。
2023-05-08 17:20:51
141
原创 1、领域驱动设计:微服务设计为什么要选择 DDD?
今天我们主要讨论了微服务设计和拆分的难题。通过 DDD 战略设计可以建立领域模型,划定领域边界,解决微服务设计过程中,边界难以划定的难题。如果你的业务焦点在领域和领域逻辑,那么你就可以选择 DDD 作为微服务的设计方法!更关键的一点是,DDD 不仅可以用于微服务设计,还可以很好地应用于企业中台的设计。如果你的企业正在做中台转型,DDD 将会是一把利器,它可以帮你建立一个非常好的企业级中台业务模型。有关这点你还会在后面的文章中见到详解。
2023-05-07 16:41:35
173
原创 1、DDD的基础概念
综合一下,我认为限界上下文的定义就是:用来封装通用语言和领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性。对同样的领域知识,不同的参与角色可能会有不同的理解,那大家交流起来就会有障碍,怎么办呢?通过用户故事分析会形成一个个的领域对象,这些领域对象对应领域模型的业务对象,每一个业务对象和领域对象都有通用的名词术语,并且一一映射。的知识体系提出了很多的名词,像:领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等等,非常多。
2023-05-05 17:32:27
610
原创 11、Broker 消息刷盘服务GroupCommitService、FlushRealTimeService、CommitRealTimeService源码深度解析
创建GroupCommitService对象时,将会初始化两个内部集合,分别是requestsWrite和requestsRead,requestsWrite用于存放putRequest方法写入的刷盘请求,requestsRead用于存放doCommit方法读取的刷盘请求。同步等待:如果消息的配置需要等待存储完成后才返回,那么构建同步刷盘请求,并且将请求存入内部的requestsWrite,并且唤醒同步刷盘线程,然后仅仅返回future,没有填充刷盘结果,将会在外部thenCombine方法处阻塞等待。
2023-05-04 16:36:54
166
原创 10、Broker asyncPutMessage处理消息以及存储的高性能设计
如果是普通模式,将会采用mmap同时进行读写。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,简单的说,使用mmap之后,数据无需拷贝到用户空间中,应用程序可以直接操作Page Cache中的数据,减少数据拷贝次数。RocketMQ对于新建的MappedFile每隔OS_PAGE_SIZE大小写入一个0,即每4k写入一个0,来让操作系统预先分配全额大小的物理内存,通过这种预先分配内存的方式,可以避免在读写消息时引发异常才分配内存而导致的性能损失。
2023-05-04 16:28:50
103
原创 8、Broker接收消息入口源码
此前我们学习了RocketMQ的Producer发送消息的源码,首先会查找查找topic的发布信息,然后找到一个消息队列MessageQueue,默认是轮询的选择,MessageQueue中存储着对应的brokerName,通过brokerName就能找到具体的brokerIP,随后获取producer客户端与这台broker的channel,随后就可以向这台broker发送消息了,注意消息只会被发送到主Broker中,即Master节点。会根据请求code将请求分发给不同的处理器进行处理。
2023-05-04 11:53:49
59
原创 9、Broker asyncSendMessage处理消息以及自动创建Topic
如果不存在该topic信息,比如第一次发送消息,那么首先调用createTopicInSendMessageMethod方法尝试创建普通topic,如果失败了,则判断是否是重试topic,即topic名是否以%RETRY%开头,如果是的话则尝试创建重试topic,如果还是创建失败,则返回TOPIC_NOT_EXIST异常信息。我们本想要该Topic在每个broker上都被自动创建,但结果仅仅是在一个broker上有该topic的信息,这样就背离了RocketMQ集群的初衷,不能实现压力的分摊。
2023-05-04 11:53:48
129
原创 7、Producer发送单向、同步、异步消息源码
该方法和单向发送的方法一样,都会基于Semaphore信号量尝试获取异步发送的资源,通过信号量控制异步消息并发发送的消息数,从而保护系统内存占用。该方法首先将请求标记为单向发送,然后基于Semaphore信号量尝试获取单向发送的资源,通过信号量控制单向消息并发发送的消息数,从而保护系统内存占用。当ChannelFutureListener回调的时候会判断如果消息发送成功,那么设置发送成功并返回,否则设置发送失败标志和失败原因,并且设置响应结果为null,唤醒阻塞的responseFuture。
2023-05-04 11:52:28
131
原创 6、Producer发送消息的总体流程
对于请求响应较慢的broker,可以在一段时间内将其状态置为不可用,消息队列选择时,会过滤掉mq认为不可用的broker,以此来避免不断向宕机的broker发送消息,选取一个延迟较短的broker,实现消息发送高可用。对于请求响应较慢的broker,可以在一段时间内将其状态置为不可用,消息队列选择时,会过滤掉mq认为不可用的broker,以此来避免不断向宕机的broker发送消息,选取一个延迟较短的broker,实现消息发送高可用。1、在消息的API中,最重要的是发送消息,需要高RTT。
2023-05-04 11:51:16
236
原创 5、Producer生产者启动源码
首先获取一个随机位于nameServer集合长度范围内的整数,作为第一个被选取的nameServer的地址,然后夯实建立长连接,如果建立成功,那么该长连接还会被放入缓存中,以后可以直接使用,这说明,同一个客户端应用中,不同的consumer和produer可以共用同一个nameServer的长连接。topicRouteTable的数据是拉取的最新的,而brokerAddrTable里的数据会同步topicRouteTable里的新数据,但是存在的旧数据没有删除,所以要定时清除。
2023-05-04 11:49:19
137
原创 4、Broker与NameServer的心跳服务源码
broker的信息会向nameServer集群中的每一个节点都上报数据,即心跳包,上报的数据包括broker的基本信息,例如brokerAddr、brokerId、brokerName、clusterName等,以及该broker的topic配置信息,比如topicName名字、perm权限、读写队列数量等等属性,当前上报的数据的时间戳版本Dataversion,以及消费过滤信息集合filterServerList。本那次我们学习了Broker和NameServer之间的心跳服务的源码。
2023-05-04 11:46:22
227
1
原创 3、Broker启动加载消息文件以及恢复数据源码
MappedFileQueue中包含MappedFile集合,以及单个commotlog文件大小等属性,而MappedFile才是真正的一个commotlog文件在Java中的映射,包含文件名、大小、mmap对象mappedByteBuffer等属性。StoreCheckpoint记录着commitLog、consumeQueue、index文件的最后更新时间点,当上一次broker是异常结束时,会根据StoreCheckpoint的数据进行恢复,这决定着文件从哪里开始恢复,甚至是删除文件。
2023-05-04 11:44:22
179
1
原创 2、Broker启动流程总结
2、不同的是,Broker模块启动时还会加载很多的文件,这个文件包括topic的各种信息topics.json,消费者的各种信息consumerOffset.json等等文件,重要的是还会加载各种消息文件,例如commitlog、consumequeue、indexfile文件等等,在加载了消息文件之后,会对文件进行恢复。3、创建消息存储对象MessageStore,该类可以直接控制管理commitLog、consumeQueue、indexFile等文件内容的读、写,非常重要。
2023-05-04 11:37:58
353
1
原创 1、NameServer启动流程总结
不同类型的请求可能会使用不同的process线程池,这就是M2。1、在启动的时候,还会启动一些定时任务,比如printAllPeriodically每一分钟打印kv信息,比如scanResponseTable每一秒钟清除无效ResponseFuture,最重要的就是scanNotActiveBroker这个定时任务,该定时任务每隔10秒执行一次扫描,检测无效的Broker,并清除Broker相关路由信息的任务,用于实现Broker相关数据的更新。负责监听 TCP网络连接请求事件,并建立好连接。
2023-04-29 14:37:06
181
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人