RocketMQ 是一款开源的分布式消息队列系统,由阿里巴巴开发。它支持高吞吐量、低延迟、高可用性和高可靠性等特性,广泛应用于分布式系统中。
一、核心概念
1、消息(Message)
消息是 RocketMQ 中的数据单位,它包含消息体和消息属性。消息体是实际传递的数据,消息属性是附加的元数据。
2、 主题(Topic)
消息主题,用于分类消息。每个消息都属于一个主题,消费者可以根据主题订阅消息。
3、生产者(Producer)
产者负责将消息发送到 RocketMQ 集群。生产者通过指定主题将消息发送到消息队列中
4、消费者(Consumer)
费者从 RocketMQ 中拉取消息并处理。消费者可以根据主题订阅消息,并处理接收到的消息。
5、消息队列(Message Queue)
每个主题下可以有多个消息队列,消息队列是消息存储的基本单位。消息队列在 RocketMQ 的各个 Broker 节点上分布。
6、Broker
Broker 是消息存储和转发的服务器。一个 RocketMQ 集群由多个 Broker 组成。Broker 管理消息的存储和消费。
7、NameServer
NameServer 是 RocketMQ 的服务发现组件,用于管理集群的路由信息。生产者和消费者通过 NameServer 获取消息的路由信息。
8、消息存储
RocketMQ 使用磁盘存储消息,并且支持消息的持久化,以确保消息不会丢失。
二、主要特性
1、高性能
RocketMQ 设计支持高吞吐量,能处理大量消息。它采用高效的存储和索引方式,减少了 I/O 操作带来的性能瓶颈。
2、高可用性
RocketMQ 通过集群模式提供高可用性。Broker 节点之间可以进行主从复制,保证消息的可靠性和持久性。
3、可靠性
消息可以配置为同步或异步发送,确保消息的可靠投递。RocketMQ 支持事务消息和消息重试机制,保证消息处理的一致性。
4、灵活的消息消费模式
支持点对点(P2P)和发布/订阅(Pub/Sub)两种消费模式。消费者可以选择按需订阅特定主题的消息,灵活应对不同场景
5、消息过滤
RocketMQ 支持基于标签(Tag)和 SQL92 语法的消息过滤功能,允许消费者根据消息属性选择感兴趣的消息。
6、事务消息
支持分布式事务,确保消息的最终一致性。RocketMQ 提供事务消息的提交和回滚机制,用于处理业务逻辑中的复杂场景。
7、顺序消息
支持顺序消息消费,保证同一队列中的消息按照发送顺序被消费。
三、架构
1、集群架构
RocketMQ 集群由多个 Broker 节点组成,分为 Master 和 Slave 节点。Master 节点负责消息的写入和读取,Slave 节点用于备份和高可用性。
2、分区
每个主题可以分为多个队列,消息被分布到不同的队列中。这样可以实现水平扩展,提高消息处理能力。
3、负载均衡
消息队列的负载均衡通过分区实现,生产者和消费者通过 NameServer 获取消息路由信息,实现均衡的消息分配。
四、使用场景
1、日志处理
在分布式系统中,RocketMQ 可以用于日志的收集和处理,支持大规模日志数据的实时分析
2、订单处理
支持高并发订单处理和交易系统的消息传递,保证订单处理的可靠性和顺序性。
3、数据同步
用于数据在不同系统之间的实时同步,确保数据的一致性和及时性。
4、异步处理
支持异步任务处理,将耗时操作异步化,提高系统响应速度和吞吐量。
五、典型使用示例
1、生产者发送消息:
public class Producer {
public static void main(String[] args) throws Exception {
// 创建生产者实例
DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
// 设置 NameServer 地址
producer.setNamesrvAddr("localhost:9876");
// 启动生产者
producer.start();
// 创建消息实例
Message msg = new Message("Topic1", "TagA", "Order1", "Hello RocketMQ".getBytes());
// 发送消息
SendResult sendResult = producer.send(msg);
System.out.printf("Send Result: %s%n", sendResult);
// 关闭生产者
producer.shutdown();
}
}
2、消费者接收消息:
public class Consumer {
public static void main(String[] args) throws Exception {
// 创建消费者实例
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroupName");
// 设置 NameServer 地址
consumer.setNamesrvAddr("localhost:9876");
// 订阅主题
consumer.subscribe("Topic1", "*");
// 注册消息监听器
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
for (MessageExt msg : msgs) {
System.out.printf("Message Received: %s%n", new String(msg.getBody()));
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
// 启动消费者
consumer.start();
}
}
六、Spring整合RocketMQ
1、创建消息生产者的配置类:
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RocketMQConfig {
@Bean
public RocketMQTemplate rocketMQTemplate() {
return new RocketMQTemplate();
}
}
2、创建消息发送的服务类:
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MessageProducerService {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendMessage(String topic, String message) {
rocketMQTemplate.convertAndSend(topic, message);
}
}
3、创建消息消费者的配置类:
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.springframework.stereotype.Component;
@Component
@RocketMQMessageListener(topic = "TopicTest", consumerGroup = "my-consumer-group")
public class MessageConsumerService implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.printf("Received message: %s%n", message);
}
}
七、总结
RocketMQ 是一款功能强大、灵活的分布式消息队列系统,支持高性能、高可靠性和高可用性。它在处理大规模消息传递和分布式系统集成中表现出色,适用于各种应用场景