这段时间做分布式事务的时候用到了RocketMQ,今天在这里总结一下最近的学习成果。
什么是MQ?
MQ就是消息队列,全称Message Queue。顾名思义,就是存放消息的队列。
为什么要用MQ?
1、异步
没错,就是我们常说的那个异步。举个栗子,现有AB两个服务,客户端调用A服务的一个接口,接口中又调用了B服务的接口,但是B服务这个接口可能实时性要求不是很高,那为了加快接口的响应速度,我们可以将A调用B这部分用MQ来代替,此时,请求逻辑就变成了客户端调用A的接口,A接口发送消息到MQ Server并响应客户端,这样用户体验就会提升。
2、解耦
当我们把消息写到MQ中,需要调用时去MQ拿,不需要时不拿,这样就可以不用一直改代码,降低了代码的耦合性。
3、削峰
这个名词看着很别扭啊,什么是削峰?其实就是使用MQ处理并发量高的场景可能出现的问题,同样举个栗子,电商大促,一个接口的并发量达到了2000,但是服务本身只能处理500的并发,这时使用MQ,将消息放到MQ Server中,让服务根据自己的性能去MQ拉取消息,执行业务处理,从而达到削峰作用。
RocketMQ简介
RocketMQ是阿里巴巴的消息队列,经过双十一双十二的洗礼,它现在已经开源给了阿帕奇,相比于其他的MQ,它的主要特点是:
1、原生支持分布式
2、支持发布订阅模型也支持点对点的消息模型
3、支持Push和Pull两种消息拉取模式
4、拥有现成的配置监控dashboard
5、支持消息重复消费、可满足严格的消息顺序消费,支持事务消息和回溯消费
6、消息堆积能力达到单机亿级且仍然可低延迟写入
7、拥有消息失败重试机制
RocketMQ中的基本概念
NameServer
路由中心,它为Producer和Consumer提供路由信息,拥有路由管理、服务注册、服务发现的功能。
Broker
消息中转的角色,它负责存储消息,转发消息。
Topic
消息主题,消息的逻辑分类,阿里的rocketMQ按topic来收费。
Tag
消息标签,也是消息的分类,只不过它的概念比topic小,可以划分topic下的消息。
Message
消息的载体,一个 Message 必须指定 topic,还可选tag 设置,以便消费端可以基于 tag 进行过滤消息。
Producer Group
生产者组,由可以发送同一类消息的生产者组成,方便在集群中动态扩展生产者,从部署上看同组名的生产者构成集群。
Consumer Group
消费者组,由可以消费同一类消息的消费者组成,方便在集群中动态扩展消费者,从部署上看同组名的生产者构成集群。
Producer
生产者,生产消息到MQ Server。
Consumer
消费者,消费MQ中的消息。
RocketMQ四大核心组件
下面是RocketMQ的部署结构图
Producer生产者,负责生产消息,提供了三种消息发送方式:同步、异步、单向。
同步发送:发送完一条消息后等待接收方的响应。
异步发送:发送完消息后不等待接收方响应继续发送下一条。
单向发送:只负责发送消息而不等待服务器回应且没有回调函数触发。
Consumer消费者,负责从broker中拉取消息进行消费,前面提到rocketMq支持Push和Pull两种消息拉取模式。
Push模式:封装了消息的拉取、消费进度和其他的内部维护工作,将消息到达时执行的回调接口留给用户应用程序来实现。所以 Push 称为被动消费类型,但从实现上看还是从消息服务器中拉取消息,不同于 Pull 的是 Push 首先要注册消费监听器,当监听器处触发后才开始消费消息。
链接:https://www.jianshu.com/p/e5cfb4ba925e
Pull模式:pull模式下消费者主动从broker中拉取消息进行消费。
Broker消息服务器,除了前面介绍的它还存储与消息相关的元数据,包括用户组、消费进度偏移量、队列信息等。Broker分为master和slave,master可读可写,slave只能读,master的brokerId为0,非0的则是slave。Broker的部署方式有四种,单master、多master、多master多slave(异步复制)、多master多slave(同步双写),具体的部署方式的区别等我下次部署后再写。
NameServer路由中心,用来保存Broker的元信息,并给生产者和消费者提供Broker信息。简单来说就是Broker启动会注册自己的信息到NameServer,Producer生产消息和Consumer消费消息时都会通过Topic先到NameServer中查找建立长连接的Broker,它们都是每隔30s在NameServer中获取自己Topic的最新队列情况。
总结
本文中关于RocketMQ的三种消息类型没有展开描述,网上有很多写的不错的可以参考看看,下篇文章准备写分布式事务解决方案。