RocketMQ 作为阿里开源的一款高性能,高吞吐量的分布式消息中间件
-
特点:
- 支持Broker和Consumer端消息过滤
- 支持发布订阅模型,和点对点
- 支持pull和push‘两种消息模式
- 单一队列百万消息,亿级消息堆积
- 支持单master节点,多master节点 ,多master多slave节点
- 任意一点都是高可用,水平拓展,生产端和消费端,队列都可以分布式
- 消息失败重试机制,支持特定level的定时消息
- 新版本底层采用Netty
- 4.3x版本支持分布式事务
- 适合金融类业务,高可用性跟踪和审计功能 -
基础概念
- Producer:消息生产者
- Producer Group:消息生产者组,发送同类消息的一个消息生产者组
- Consumer:消费者
- Consumer Group:消费同类消息的多个实例
- Topic:主题,topic是逻辑管理单位,一个topic下可以有多个queue
- Tag:标签,子主题,对topic的进一步细化,用于区分同一个主题下的不同业务的消息
- Message:消息,每个message必须指定一个queue
- Broker:MQ程序,接受生产的消息,提供给消费者消费的程序
- NameServer:给生产和消费者提供路由消息,提供轻量级的服务发现,路由,元数据信息,可以多个部署,互相独立(类似zk,但比zk轻量级)
- Offset:偏移量,可以理解为消息进度
- Commit log:消息存储会写在Commit Log文件里面 -
心跳机制
- 单个Broker跟所有Namesrv保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息。Namesrv会反查Broer的心跳信息, 如果某个Broker在2分钟之内都没有心跳,则认为该Broker下线,调整Topic跟Broker的对应关系。但此时Namesrv不会主动通知Producer、Consumer有Broker宕机。
- Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。Broker端每10秒检查一次当前存活的Consumer,若发现某个Consumer 2分钟内没有心跳, 就断开与该Consumer的连接,并且向该消费组的其他实例发送通知,触发该消费者集群的负载均衡(rebalance)。
- 生产者每30秒从Namesrv获取Topic跟Broker的映射关系,更新到本地内存中。再跟Topic涉及的所有Broker建立长连接,每隔30秒发一次心跳。 在Broker端也会每10秒扫描一次当前注册的Producer,如果发现某个Producer超过2分钟都没有发心跳,则断开连接。
一个简单MQ例子:
依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
producer端简单demo:
@Component
public class MQtestProducer {
private String producerGroup = "test1_gropup";
private String nameServerAddr = "127.0.0.1:9876";
private DefaultMQProducer producer;
public MQtestProducer(){
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(nameServerAddr);
start();
}
public void start(){
try {
this.producer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
public DefaultMQProducer getProducer(){
return