
RocketMQ
文章平均质量分 83
ph3636
这个作者很懒,什么都没留下…
展开
-
第一个开源框架的issue(RocketMQ)
之前在学习RocketMQ的时候发现了一个问题,客户端和broker之间关于topic的长度判断不一致,客户端发消息的判断为org.apache.rocketmq.client.Validators#checkTopic,这里的CHARACTER_MAX_LENGTH为255if (topic.length() > CHARACTER_MAX_LENGTH) { throw n...原创 2019-12-18 18:53:43 · 346 阅读 · 0 评论 -
RocketMQ源码分析之Broker处理拉取消息请求(1)
broker处理拉取消息请求,第一次brokerAllowSuspend为true。public RemotingCommand processRequest(final ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException { return this.proc...原创 2019-05-17 15:27:09 · 2723 阅读 · 0 评论 -
RocketMQ源码分析之消息主从同步(下)
读服务线程主监听到通道内有数据需要读,处理完读事件后计算心跳时间是否超过haHousekeepingInterval = 1000 * 20public void run() { HAConnection.log.info(this.getServiceName() + " service started"); while (!this.isStopped()) { ...原创 2019-05-01 00:31:18 · 314 阅读 · 0 评论 -
RocketMQ源码分析之消息主从同步(上)
主从同步消息入口代码在handleHA(result, putMessageResult, msg);主要分为异步主从和同步主从,分别由BrokerRole枚举的ASYNC_MASTER和SYNC_MASTER决定,判断是否需要等待消息在从服务器保存成功,也就是完全保证消息在主从都要保存成功,判断是否有从服务存活即连接数是否大于0,继续判断主从消息之间的偏移量是否小于haSlaveFallbehi...原创 2019-05-01 00:26:19 · 268 阅读 · 0 评论 -
RocketMQ源码分析之消息异步刷盘
异步刷盘根据是否使用临时存储池分为先把直接内存中的数据提交到文件通道后刷盘和直接通过mmap刷盘public boolean isTransientStorePoolEnable() { return transientStorePoolEnable && FlushDiskType.ASYNC_FLUSH == getFlushDiskType() ...原创 2019-05-01 00:21:38 · 422 阅读 · 0 评论 -
RocketMQ源码分析之消息同步刷盘
同步刷盘,根据配置判断是哪一种刷盘方式,同步刷盘的线程是GroupCommitService,这个在CommitLog实例化时已经设置了,判断是否要等待消息刷盘成功,等待的话就需要用countDownLatch进行等待,否则的话只需要唤醒线程进行刷盘即可。public void handleDiskFlush(AppendMessageResult result, PutMessageRes...原创 2019-05-01 00:19:20 · 554 阅读 · 0 评论 -
RocketMQ源码分析之消息ID
msgId消息唯一id,发消息时有生产端生成,保存在消息的属性中,也是发送消息的返回值SendResult中的msgId,主要用于创建索引和作为事务消息的事务id。MessageClientIDSetter.setUniqID(msg);public static final String PROPERTY_UNIQ_CLIENT_MESSAGE_ID_KEYIDX = "UNIQ_K...原创 2019-05-01 00:16:37 · 1410 阅读 · 0 评论 -
RocketMQ源码分析之消息存储(下)
往文件中写入消息,判断写偏移量是否小于文件大小,根据临时缓存池或者mmap获取buffer内存,把要写的位置挪到wrotePositionpublic AppendMessageResult appendMessage(final MessageExtBrokerInner msg, final AppendMessageCallback cb) { return append...原创 2019-05-01 00:13:33 · 594 阅读 · 0 评论 -
RocketMQ源码分析之消息存储(上)
消息存储的主要包装类是commitLog,给消息设置存储时间,消息正文crc,事务消息后续再解析public PutMessageResult putMessage(final MessageExtBrokerInner msg) { // Set the storage time msg.setStoreTimestamp(System.currentTimeMillis(...原创 2019-05-01 00:11:34 · 394 阅读 · 0 评论 -
RocketMQ源码分析之Broker(2)
初始化BrokerControllerinitialize()首先加载四个配置文件,主要是恢复以前的数据,当然第一次重启的话,这四个文件中也没有任何数据,他们主要是继承了ConfigManager类扩展了具体的文件存储方法以及编解码方法。初始化通信服务类,快速通信服务类监听端口为10909public boolean initialize() throws CloneNotSuppo...原创 2019-04-20 12:47:42 · 752 阅读 · 1 评论 -
RocketMQ源码分析之Broker(1)
实例化本次举例的broker的主方法在org.apache.rocketmq.broker.BrokerStartup,同样的通过命令行启动可以读取入参配置的具体文件,根据启动命令配置的-c属性读取文件,并设置broker配置类BrokerConfig,服务端通信配置类NettyServerConfig,客户端通信配置类NettyClientConfig,具体信息存储配置类MessageSto...原创 2019-04-20 12:18:33 · 708 阅读 · 0 评论 -
RocketMQ源码分析之编解码
众多周知,在进行网络通信的时候都需要编解码,而RocketMQ依托Netty框架进行网络交互,只需要在上行和下行通道处理类中进行扩展处理即可完成编解码的工作。// 编码,下行通道往网络通道中写数据class NettyEncoder extends MessageToByteEncoder<RemotingCommand>class MessageToByteEncoder&...原创 2019-04-20 12:13:02 · 423 阅读 · 0 评论 -
RocketMQ源码分析之NameServer(下)
启动public void start() throws Exception { this.remotingServer.start(); if (this.fileWatchService != null) { this.fileWatchService.start(); }}NettyRemotingServer初始化Worker线程池...原创 2019-04-20 12:08:51 · 427 阅读 · 0 评论 -
RocketMQ源码分析之Broker处理拉取消息请求(2)
判断是否有额外信息,暂不考虑。public boolean isExtAddr(long tagsCode) { return ConsumeQueueExt.isExtAddr(tagsCode);}public static boolean isExtAddr(final long address) { return address <= MAX_ADDR;...原创 2019-05-17 15:30:11 · 1051 阅读 · 0 评论 -
RocketMQ源码分析之Broker处理拉取消息请求(3)
当目前没有新消息产生时,判断是否暂停等待,有暂停的标志和broker允许等待,判断长轮训是否可用private boolean longPollingEnable = true;private long shortPollingTimeMills = 1000;case ResponseCode.PULL_NOT_FOUND:if (brokerAllowSuspend &&...原创 2019-05-17 15:33:01 · 1119 阅读 · 0 评论 -
RocketMQ源码分析之消费消息(上)
当从broker拉取到消息后,开始执行回调方法private void executeInvokeCallback(final ResponseFuture responseFuture) { boolean runInThisThread = false; ExecutorService executor = this.getCallbackExecutor(); ...原创 2019-05-17 15:35:21 · 870 阅读 · 0 评论 -
RocketMQ源码分析之权限ACL
Broker服务端初始化时会初始化权限相关的类,是否校验权限需要通过aclEnable控制,在指定目录下查找所有的访问校验规则类BrokerController#initializepublic static final String ACL_VALIDATOR_ID = "META-INF/service/org.apache.rocketmq.acl.AccessValida...原创 2019-06-13 17:06:26 · 2671 阅读 · 0 评论 -
RocketMQ源码分析之主从同步消费信息
因为从broker也需要提供拉取消息的功能,所以需要把主broker的topic信息,订阅组信息,消息消费偏移量信息复制过来,当broker启动后会执行定时程序,一分钟同步一次this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { ...原创 2019-05-23 17:57:10 · 504 阅读 · 0 评论 -
RocketMQ源码分析之消息重试
当消息消费失败后需要把消息重新发送给broker,可以设置延迟级别public boolean sendMessageBack(final MessageExt msg, final ConsumeConcurrentlyContext context) { int delayLevel = context.getDelayLevelWhenNextConsume(); t...原创 2019-05-23 17:50:00 · 707 阅读 · 0 评论 -
RocketMQ源码分析之事务消息(4)
否则的话获取准备消息private GetResult getHalfMsg(MessageQueue messageQueue, long offset) { GetResult getResult = new GetResult(); PullResult result = pullHalfMsg(messageQueue, offset, PULL_MSG_RETRY...原创 2019-05-23 17:30:03 · 665 阅读 · 0 评论 -
RocketMQ源码分析之事务消息(3)
当生产者发送消息后没有结束事务消息或者请求状态为未知时,就需要依靠broker的事务消息检查线程来回查消息状态。private long transactionCheckInterval = 60 * 1000;private long transactionTimeOut = 6 * 1000;private int transactionCheckMax = 15;protect...原创 2019-05-23 17:25:19 · 681 阅读 · 0 评论 -
RocketMQ源码分析之事务消息(2)
broker处理事务结束的请求,先判断当前broker的角色是否是从节点if (BrokerRole.SLAVE == brokerController.getMessageStoreConfig().getBrokerRole()) { response.setCode(ResponseCode.SLAVE_NOT_AVAILABLE); LOGGER.warn("Mess...原创 2019-05-23 15:15:43 · 418 阅读 · 0 评论 -
RocketMQ源码分析之事务消息(1)
producer使用事务消息,需要事务生产者类,线程池是为了处理broker的回查事务状态的处理的。事务监听器主要是用来执行本地事务,当事务消息发送成功后,执行本地事务,然后在判断是否提交回滚事务消息。还有就是当broker回查时检查本地事务状态的作用。TransactionListener transactionListener = new TransactionListenerImp...原创 2019-05-23 15:11:44 · 644 阅读 · 0 评论 -
RocketMQ源码分析之有序消息(3)
执行消费请求任务,判断执行队列的状态是否有效public void run() { if (this.processQueue.isDropped()) { log.warn("run, the message queue not be able to consume, because it's dropped. {}", this.messageQueue); ...原创 2019-05-17 15:52:30 · 1003 阅读 · 0 评论 -
RocketMQ源码分析之有序消息(2)
broker接收消息队列解锁请求private RemotingCommand unlockBatchMQ(ChannelHandlerContext ctx, RemotingCommand request) throws RemotingCommandException { final RemotingCommand response = RemotingCommand....原创 2019-05-17 15:50:10 · 382 阅读 · 0 评论 -
RocketMQ源码分析之有序消息(1)
生产者发送消息时需要把同一类有序消息都发送到相同的消息队列中SendResult sendResult = producer.send(msg, new MessageQueueSelector() { @Override public MessageQueue select(List<MessageQueue> mqs, Message msg, Object ...原创 2019-05-17 15:43:49 · 462 阅读 · 0 评论 -
RocketMQ源码分析之延迟消息
设置延迟消息只需要在消息的属性中设置延迟级别就行,范围在1到18,当消息在存储之前会更换原消息的topic以及队列id,替换成延迟队列统一的topic以及18个队列中的其中一个id。public void setDelayTimeLevel(int level) { this.putProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL,...原创 2019-05-17 15:39:44 · 319 阅读 · 0 评论 -
RocketMQ源码分析之消费消息(下)
提交消费请求,默认是每次消费一个消息,对消息进行数量上的拆分,然后放进线程池中执行public void submitConsumeRequest( final List<MessageExt> msgs, final ProcessQueue processQueue, final MessageQueue messageQueue, fina...原创 2019-05-17 15:37:12 · 356 阅读 · 2 评论 -
RocketMQ源码分析之NameServer(上)
前序前面几篇是关于RocketMQ的介绍,从这篇开始就根据源码具体解析,分支是master,版本号是4.4.0。实例化注册中心的主方法在org/apache/rocketmq/namesrv/NamesrvStartup.java,通过命令行启动可以读取入参配置的具体文件,根据启动命令配置的-c属性读取文件,并设置到注册配置类namesrvConfig和服务端通信配置类nettySer...原创 2019-04-20 10:52:53 · 422 阅读 · 0 评论 -
RocketMQ源码分析之拉取消息(4)
构建拉取请求PullRequestpublic void dispatchPullRequest(List<PullRequest> pullRequestList) { for (PullRequest pullRequest : pullRequestList) { this.defaultMQPushConsumerImpl.executeP...原创 2019-05-02 14:54:10 · 535 阅读 · 0 评论 -
RocketMQ源码分析之拉取消息(3)
心跳发送完毕后获取broker对应的版本,组装更新消费偏移量请求头UpdateConsumerOffsetRequestHeader,请求码是UPDATE_CONSUMER_OFFSET = 15public void updateConsumerOffsetOneway( final String addr, final UpdateConsumerOffsetReque...原创 2019-05-02 14:51:15 · 953 阅读 · 0 评论 -
RocketMQ源码分析之Broker(3)
初始化关于通信安全的文件监听模块,用来观察网络加密配置文件的更改。if (TlsSystemConfig.tlsMode != TlsMode.DISABLED) { // Register a listener to reload SslContext try { fileWatchService = new FileWatchService( ...原创 2019-04-20 18:44:06 · 484 阅读 · 0 评论 -
RocketMQ事务消息
Apache RocketMQ在4.3.0版中已经支持分布式事务消息,这里RocketMQ采用了2PC的思想来实现了提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息,如下图所示。RocketMQ事务消息流程概要上图说明了事务消息的大致方案,其中分为两个流程:正常事务消息的发送及提交、事务消息的补偿流程。事务消息发送及提交:(1) 发...原创 2019-04-07 11:27:49 · 769 阅读 · 0 评论 -
RocketMQ消息过滤与查询
消息过滤RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件,是在Consumer端订阅消息时再做消息过滤的。RocketMQ这么做是还是在于其Producer端写入消息和Consomer端订阅消息采用分离存储的机制来实现的,Consumer端订阅消息是需要通过ConsumeQueue这个消息消费的逻辑队列拿到一个索引,然后再从CommitLog里面读取真正的消息实体内容,所...原创 2019-04-07 11:26:19 · 3131 阅读 · 0 评论 -
RocketMQ负载均衡
RocketMQ中的负载均衡都在Client端完成,具体来说的话,主要可以分为Producer端发送消息时候的负载均衡和Consumer端订阅消息的负载均衡。Producer的负载均衡Producer端在发送消息的时候,会先根据Topic找到指定的TopicPublishInfo,在获取了TopicPublishInfo路由信息后,RocketMQ的客户端在默认方式下selec...原创 2019-04-07 11:24:41 · 1531 阅读 · 0 评论 -
RocketMQ通信机制
简介RocketMQ消息队列集群主要包括NameServe、Broker(Master/Slave)、Producer、Consumer4个角色,基本通讯流程如下:(1) Broker启动后需要完成一次将自己注册至NameServer的操作;随后每隔30s时间定时向NameServer上报Topic路由信息。(2) 消息生产者Producer作为客户端发送消息时候,需要根据...原创 2019-04-07 11:22:56 · 1352 阅读 · 0 评论 -
RocketMQ特性
特性订阅与发布消息的发布是指某个生产者向某个topic发送消息;消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。消息顺序消息有序指的是一类消息消费时,能按照发送的顺序来消费。例如:一个订单产生了三条消息分别是订单创建、订单付款、订单完成。消费时要按照这个顺序消费才能有意义,但是同时订单之间是可以并行消费的。Ro...原创 2019-04-07 11:19:02 · 172 阅读 · 0 评论 -
RocketMQ消息存储
消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面来分别展开叙述。消息存储整体架构消息存储架构图中主要有下面三个跟消息存储相关的文件构成。(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端...原创 2019-04-07 11:17:49 · 1104 阅读 · 0 评论 -
RocketMQ架构设计
简介Apache RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。它提供了多种功能: 发布/订阅消息模型 预定的消息传递 消息追溯性按时间或偏移量 记录流媒体的中心 大数据集成 可靠的FIFO和严格的有序消息传递在同一队列中 高效的推拉消费模式 ...原创 2019-04-07 11:15:13 · 462 阅读 · 0 评论 -
RocketMQ的autoCreateTopicEnable配置
1.使用RocketMQ进行发消息时,必须要指定topic,对于topic的设置有一个开关autoCreateTopicEnable,一般在开发测试环境中会使用默认设置autoCreateTopicEnable = true,但是这样就会导致topic的设置不容易规范管理,没有统一的审核等等,所以在正式环境中会在Broker启动时设置参数autoCreateTopicEnable = false。...原创 2018-03-12 18:01:46 · 22576 阅读 · 17 评论