RocketMQ系列之基础入门
1:MQ介绍和几大产品对比
1.1:MQ介绍
MQ:消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
1.2:常见MQ产品对比
常见的MQ产品有Kafana,RocketMQ,RabbitMQ
但是RocketMQ使用Java语言编写,便于Java程序员使用,调错。
2:RocketMQ基础概念
2.1:模型介绍
RocketMQ模型如下图所示
在这张图中有几个重要概念:
前置概念:
1.Topic:是一种消息的逻辑分类,比如说你有订单类的消息,也有库存类的消息,那么就需要进行分类,一个是订单 Topic 存放订单相关的消息,一个是库存 Topic 存储库存相关的消息。
2.Message
Message 是消息的载体。一个 Message 必须指定 topic,相当于寄信的地址。Message 还有一个可选的 tag 设置,以便消费端可以基于 tag 进行过滤消息。也可以添加额外的键值对,例如你需要一个业务 key 来查找 broker 上的消息,方便在开发过程中诊断问题。
3.tag:
标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息。
节点类型:
1.NameServer
NameServer:是一个无状态的节点,可以集群部署,起到路由作用
2.Broker
Broker是整个服务的中心,起到消息存储等功能,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。
3.Producer
Producer 是消息的产生者:与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。
4.Consumer
Consumer是消息的消费者:与Name Server集群中的其中一个节点(随机选择,但不同于上一次)建立长连接,定期从Name Server 取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。
2.2:部署模式
单 master 模式
多 master 模式
多 master 多 slave 异步复制模式
多 master 多 slave 同步双写模式
刷盘策略:同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)
同步方式:同步双写和异步复制(指的一组 master 和 slave 之间数据的同步)
3:RocketMQ基础实战篇
3.1:RocketMQ常见命令
1.启动 NameSrv Broker
启动:nohup sh bin/mqnamesrv &
sh bin/mqbroker -n localhost : 9876 &
2.关闭 NameSrv Broker
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
注:
nohup:代表永久执行
&:代表后台执行
创建/修改 Topic : updateTopic
删除 Topic : deleteTopic
创建/修改订阅组:updatesubGroup
删除订阅组:deleteSubGroup
更新 Broker 配置:updateBrokerConfig
查询 Topic 的路由信息:TopicRoute
查看 Topic 列表信息:Topiclist
根据消息 ID 查询消息:queryMsgByld
3.2:RocketMQ-console介绍搭建
clone 控制台所在代码:https://github.com/apache/rocketmq-externals
打开idea导入rocketmq-connect-console
配置rocketmq.config.namesrvAddr=localhost:9876运行即可
启动之后即可通过localhost:8080图形化查看RocketMQ
3.2:RocketMQ与SpringBoot的结合
1.加入rocketmq-spring-boot-starter
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2.创建消费者Consumer
@Component
@RocketMQMessageListener(
topic = "my-topic",
consumerGroup = "my-group",
selectorExpression = "*"
)
public class SpringConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String msg) {
System.out.println("接收到消息 -> " + msg);
}
}
3.创建生产者
@Component
public class SpringProducer {
public final RocketMQTemplate rocketMQTemplate;
public SpringProducer(RocketMQTemplate rocketMQTemplate) {
this.rocketMQTemplate = rocketMQTemplate;
}
/**
* 发送消息
*
* @param topic
* @param msg
*/
public void sendMsg(String topic, String msg) {
rocketMQTemplate.convertAndSend(topic, msg);
}
}
4.正式测试
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class TestHalo {
@Autowired
public SpringProducer springProducer;
@Test
public void testSendMessage() {
springProducer.sendMsg("my-topic", "发送消息");
}
}