摘要: 如果一个broker正常退出,是会删除abort文件的。那么启动broker的时候发现abort文件还存在,那么说明上次是异常终止,会进入到commit-log的recoverAbnormally逻辑里面,因为所有其他的信息都是从commit-log获取到的,所以追根溯源只能从commit-log开 阅读全文
posted @ 2019-12-08 22:28 notlate 阅读(1020) 评论(3) 推荐(0) 编辑
摘要: 首先解释下consumeQueue,由于commit-log是根据消息先后存储的,而我们消费的时候是根据topic来筛选的,所以需要一个队列根据topic来划分,所以consumeQueue就是干这个事情的。而indexfile顾名思义就是索引文件,用来做单纯查询的。 private final C 阅读全文
posted @ 2019-12-08 22:25 notlate 阅读(636) 评论(1) 推荐(0) 编辑
摘要: 生产者发送一条消息的时候,在主broker里面最终会运行到: PutMessageResult result = this.commitLog.putMessage(msg); 在这里第一次有了锁,也就是发送一条消息,一路行都没有锁,直到这里涉及mappedfile的时候才有锁。因为要保证消息有序性 阅读全文
posted @ 2019-12-08 21:09 notlate 阅读(834) 评论(0) 推荐(0) 编辑
摘要: 新增topic是需要客户端直接通知broker完成的: 通过createAndUpdateTopicConfig方法 发送给broker以后,在AdminBrokerProcessor里面负责处理这个类型消息: 在updateTopicConfig方法: TopicConfig是复写了equal方法 阅读全文
posted @ 2019-12-08 20:21 notlate 阅读(8192) 评论(0) 推荐(0) 编辑
摘要: 首先看一下RemotingCommand的几个重要属性: 除了static之外,还有body、extfields是transitent,除此之外都是要直接进行序列化的,默认用fastjson直接序列化。 这里面的extfields跟customHeader是互相转换的,也就是序列化的时候用前者传入, 阅读全文
posted @ 2019-12-08 20:15 notlate 阅读(2969) 评论(0) 推荐(0) 编辑
摘要: 在sendDefaultImpl方法里面: 如果是同步的话,必须发送成功,还必须返回是ok才认为成功,否则继续重试。 如果是oneway、异步的话,直接return null出去了,那么异步如何做重试? 上面代码最核心的发送函数就是sendKernelImpl 可以看到,对于异步模式和非异步模式,s 阅读全文
posted @ 2019-10-01 21:42 notlate 阅读(3423) 评论(0) 推荐(0) 编辑
摘要: 这里的selectOneMessageQueue的其实内部调用MQFaultStrategy内部对象的selectOneMessageQueue: 我个人看来,这个估算功能倒不是特别重要,所以mq默认是不使用这个逻辑,不过这个不妨碍我们研究下。下面是MQFaultStrategy的selectOne 阅读全文
posted @ 2019-10-01 19:14 notlate 阅读(2383) 评论(0) 推荐(0) 编辑
摘要: 对于一个生产者来说,在进行sendmessage的时候,需要知道这个topic应该发给哪个broker。如果没有路由信息的话,需要取注册中心,通过GET_ROUTEINTO_BY_TOPIC去注册中心拿到消息。 介绍下面具体流程之前,还是先介绍注册额中心里面路由管理者RouteInfoManager 阅读全文
posted @ 2019-01-27 16:44 notlate 阅读(1410) 评论(0) 推荐(0) 编辑
摘要: 一个haservice下面有accpet和haclient分别对应客户端和服务端,grouptranserservie用来控制消息是否获取到,下面具体讲。 拿haclient举例子,在主线程做的事情 也就是在rocketmq里面,一个具体的任务就是单独分配一个线程,从而发挥多线程优势,在主线程上面休 阅读全文
posted @ 2019-01-27 14:22 notlate 阅读(1742) 评论(0) 推荐(0) 编辑
摘要: SO_LINGER选项用来改变此缺省设置。使用如下结构: struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */ }; 有下列三种情况: 1、设置 l_onoff为0,则该选项关闭 阅读全文
posted @ 2019-01-27 12:13 notlate 阅读(178) 评论(0) 推荐(0) 编辑