RocketMQ就是一个消息中间键用于实现异步传输与解耦
那什么是消息中间键呢?
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也有Producer(生产者)、Consumer(消费者)
RocketMQ就是一种中间键 ,如下图所示为MQ的架构:
在上图中整体可以分为4个角色,分别是:NameServer, Broker, Producer, Consumer
- Broker(邮递员):
- Broker是RocketMQ的核心,负责消息的接受,存储,投递等功能
- NameServer(邮局):
- 消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信 息
- Producer(寄件人):
- 消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker发 送消息
- Consumer(收件人):
- 消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获 取消息
- Topic(地区):
- 用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收 消息
- Message Queue(邮件):
- 为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个 Message Queue读取消息
- Message:
- 消息的载体
MQ里面肯定包含了我们的消息生产者(producer)和消息消费者(consumer),对我们来说这就是两个服务,即两个应用程序,这两个应用程序之前要传信息都是直传,但是直传都是同步传输且耦合性较高。
所以我们引入了中间件MQ,MQ中它首先包含一个NameServer 的核心对象,这个NameServer不需要我们人工来进行创建,MQ只要一跑通就识别有了。NameServer就相当于所有快递站点的管理者(即一个总的快递站点),是一个协调调度者,是整个MQ最核心的一个全局对象,用来管理所有的快递站点。
Broker就相当于一个真实的快递站点或是一个快递员,未来它会帮你创建好快递站点并按照你的消息数据委派给对应的快递员进行数据的传递。那我们可以有多个Broker ,那么多个Broker之间我们要来进行数据的传递和数据的管理,就要用NameServer来进行管理,Broker是真正用来实现快递传输的。
在Broker的下一级还有几个角色,例如Topic,可以理解为我们的地区,一个快递员或一个站点可以负责一个或多个地区,所以一个Broker可以有多个Topic。
在Topic里面有Message queue,这个可以理解为一个消息包裹,Topic一个地区可以有多个包裹,而一个Message queue里面又包含了很多message,很多信息。
消息的发送和接收
发送同步消息:
这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。
消息发送步骤:
1. 创建消息生产者, 指定生产者所属的组名
2. 指定Nameserver地址
3. 启动生产者
4. 创建消息对象,指定主题、标签和消息体
5. 发送消息
6. 关闭生产者
发送异步消息:
异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。
单向发送消息:
这种方式主要用在不特别关心发送结果的场景,例如日志发送。
消费消息:
1. 负载均衡模式(默认方式)
消费者采用负载均衡方式消费消息,多个消费者共同消费队列消息,每个消费者处理的消息不同
2. 广播模式 消费者采用广播的方式消费消息,每个消费者消费的消息都是相同的
//广播模式消费
consumer.setMessageModel(MessageModel.BROADCASTING);
发送方式 | 发送TPS | 发送结果反馈 | 可靠性 |
同步发送 | 快 | 有 | 不丢失 |
异步发送 | 快 | 有 | 可能丢失 |
单向发送 | 快 | 无 | 可能丢失 |