码迷,mamicode.com
首页 > 其他好文 > 详细

rocketMQ总结

时间:2020-05-07 19:30:48      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:异步发送   not   sele   ble   主从   pack   ima   tag   store   

技术图片

一、RocketMQ组成

1、NameServer 协调者,类似zookeeper,基于内存完成
2、Broker 实例
3、Topic
4、tag topic里的标签
5、Message Queue topic里的队列
6、offset 标记消息在Message Queue里的位置,标记消费读取时自增长

 

二、消息模式

Clustering 

同一个 ConsumerGroup (GroupName相同)里的Consumer 只消费所订阅消息一部分内容。

Broadcasting
同一个 ConsumerGroup (GroupName相同)里的Consumer 只消费所订阅消息是全部内容。

实现区别:
Clustering模式即同组ConsumerGroup下的每个Consumer消费位置不同,由Broker端存储和控制Offset
Broadcasting模式下每个Consumer使用LocalFileOffsetStore本地存储Offset

 

三、生产消费

DefaultMQProducer

返回状态:FLUSH_DISK_TIMEOUT表示同步刷盘策略下规定时间内未完成刷盘 FLUSH_SLAVE_TIMEOUT表示主备模式下SYNC_MASTER方式规定时间内未完成主从同步 SLAVE_NOT_AVAILABLE表示主备模式下SYNC_MASTER方式没有找到Slave SEND_OK表示发送成功

延时消息:setDelayTimeLevel设置延迟时间

自定义消息发送规则:使用MessageQueueSelector类在覆写select方法中返回选中的MessageQueue

事务支持:两阶段提交协议 发送方向RocketMQ发送待确认消息-持久化后返回发送成功-将本地事务逻辑与发送确认消息包装在同一事务中并执行事务-RocketMQ收到确认消息后订阅方对消息可见并消费 发送方事务阶段异常则待确认消息作废 发送方提供给RocketMQ回查接口用于查询事务结果

同步发送: 需要等MQ返回相应

异步发送:无需MQ返回相应,需要实现SendCallback

 

消费者: (分push、pull模式)
interface MQPushConsumer:
DefaultMQPushConsumer:由系统控制读取操作,收到消息后自动调用传人的处理方法来处理

 

interface MQPullConsumer:
实现类 DefaultMQPullConsumer:读取操作中的大部分功能由使用者自主控制,使用者记录offset

Push与Pull比较:Push(推)由服务端主动推送消息至客户端,实际通过Pull保持连接并等待服务端获得从生产者发送来的消息,在等待期间若获得消息则通过连接发送至消费者,在等待超过限定时间后返回空结果至消费者 Pull(拉)由消费者发起连接到服务端获得消息,需预判消息发送频率,连接频率过长过短均有问题



四、协调者
 

1.功能

概览:各角色机器均定期发送数据至协调者 协调者根据消息请求码做相应处理,更新存储的对应信息 协调者彼此之间互相独立 无状态 

2.结构

HashMap<String,List<QueueData>> topicQueueTable key为Topic名称 List长度代表Master Broker个数 QueueData存储Broker名称、读写queue数量、同步标识

HashMap<String,BrokerData> BrokerAddrTable key为Broker名称 BrokerData包含所属的Cluster名称、Master Broker地址和Slave Broker地址

HashMap<String,Set<String>> ClusterAddrTable key为Cluster名称 value为BrokerName集合

HashMap<String,BrokerLiveInfo> BrokerLiveTable key为BrokerAddr BrokerLiveInfo包括这台Broker机器的上次更新时间 

HashMap<String,List<String>> filterServerTable key为BrokerAddr value为与这个Broker关联的多个FilterServer地址

3.Remoting模块

概览: 通信通过Remoting模块统一自定义消息格式RemotingCommand完成 

 
技术图片
 

4.协议格式

 
技术图片

消息队列的核心机制


1.消息存储结构

物理存储文件CommitLog 消息的逻辑队列ConsumerQueue类似数据库的索引文件 每个Topic下的每个MessageQueue有一个对应的ConsumeQueue文件

2.高可用机制

在创建Topic时将Topic的多个MessageQueue创建在多个Broker组中(相同Broker名称 不同BrokerId的机器组成一个Broker组),当一个Broker组内的Master不可用时可向其他Broker组的Master发送消息

3.同步刷盘和异步刷盘

异步刷盘:写入到内存即返回写成功 当内存消息量累计到一定程度后,统一写入磁盘

同步刷盘:写入内存后通知刷盘线程刷盘,刷盘完成后刷盘线程唤醒等待的线程返回写成功的状态

4.同步复制和异步复制

同步复制:Master和Slave均写成功后返回成功状态

异步复制:Master写成功即返回成功状态

5.磁盘读取机制
顺序写,随机读,零拷贝

6.写入及复制机制
Master读和写,Slave只读,生产者写入Master,Master复制到Slave

顺序机制
1、完全顺序
需要把Topic的读写队列设置为1,Producer 和 Consumer 并发设置为1

2、部分顺序
1)生产者需要把消息发送到同一个Message Queue;
2)消费组需要不并发读一个Message Queue;

 

 

为什么不用Zookeeper
RocketMQ不需要Master选举等复杂功能

 

 

rocketMQ和kafka不同
1、偏向事务机制;
2、不支持Master选举,即不能Slave转Master

 

rocketMQ总结

标签:异步发送   not   sele   ble   主从   pack   ima   tag   store   

原文地址:https://www.cnblogs.com/anhaogoon/p/12844853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!