RabbitMQ 基础入门

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正

文章目录

前言

[1. 重要概念](#1. 重要概念)

[1.1 Publisher](#1.1 Publisher)

[1.2 Message](#1.2 Message)

[1.3 Exchange](#1.3 Exchange)

[1.4 BindingKey](#1.4 BindingKey)

[1.5 Routingkey](#1.5 Routingkey)

[1.6 Queue](#1.6 Queue)

[1.7 Consumer](#1.7 Consumer)

[1.8 Connection](#1.8 Connection)

[1.9 Channel](#1.9 Channel)

[1.10 Virtual Host](#1.10 Virtual Host)

1.11Broker

[2. RabbitMQ安装](#2. RabbitMQ安装)

[3. 如何使用RabbitMQ发送消息?](#3. 如何使用RabbitMQ发送消息?)

[4. 消息怎么路由?](#4. 消息怎么路由?)


前言

RabbitMQ 与 AMQP 遵循相同的模型架构,其架构示例图如下


以下是本篇文章正文内容

1. 重要概念

1.1 Publisher

消息生产者,就是投递消息的程序

发布者 (或称为生产者) 负责生产消息并将其投递到指定的交换器上。

1.2 Message

消息由消息头和消息体组成,消息头用于存储与消息相关的元数据:如目标交换器的名字 (exchange_name)路由键 (RountingKey)和其他可选配置 (properties) 信息。消息体为实际需要传递的数据。

1.3 Exchange

交换器负责接收来自生产者的消息,并将消息路由到一个或者多个队列中,如果路由不到,则返回给生产者或者直接丢弃,这取决于交换器的 mandatory 属性:

  • 当 mandatory 为 true 时:如果交换器无法根据自身类型和路由键找到一个符合条件的队列,则会将该消息返回给生产者;
  • 当 mandatory 为 false 时:如果交换器无法根据自身类型和路由键找到一个符合条件的队列,则会直接丢弃该消息。

1.4 BindingKey

交换器与队列通过 BindingKey 建立绑定关系。

1.5 Routingkey

基于交换器类型的规则相匹配时,消息被路由到对应的队列中

生产者将消息发给交换器的时候,一般会指定一个 RountingKey,用来指定这个消息的路由规则,当 RountingKey 与 BindingKey相匹配时,消息被路由到对应的队列中。

1.6 Queue

消息队列载体,每个消息都会被投入到一个或多个队列。

用于存储路由过来的消息,多个消费者可以订阅同一个消息队列,此时队列会将收到的消息将以轮询 (round-robin) ​ 的方式分发给所有消费者,即每条消息只会发送给一个消费者,不会出现一条消息被多个消费者重复消费的情况。

1.7 Consumer

消息消费者,就是接受消息的程序

消费者订阅感兴趣的队列,并负责消费存储在队列中的消息。为了保证消息能够从队列可靠地到达消费者,RabbitMQ 提供了消息确认机制 (messageacknowledgement),并通过 autoAck 参数来进行控制

  • 当 autoAck 为 true 时:此时消息发送出去 (写入TCP套接字) 后就认为消费成功,而不管消费者是否真正消费到这些消息。当 TCP 连接或 channel 因意外而关闭,或者消费者在消费过程之中意外宕机时,对应的消息就丢失。因此这种模式可以提高吞吐量,但会存在数据丢失的风险。
  • 当 autoAck 为 false 时:需要用户在数据处理完成后进行手动确认,只有用户手动确认完成后,RabbitMQ 才认为这条消息已经被成功处理,这可以保证数据的可靠性投递,但会降低系统的吞吐量。

1.8 Connection

用于传递消息的 TCP 连接。

1.9 Channel

消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

RabbitMQ 采用类似 NIO (非阻塞式 IO ) 的设计,通过 Channel 来复用 TCP 连接,并确保每个 Channel的隔离性,就像是拥有独立的 Connection 连接。当数据流量不是很大时,采用连接复用技术可以避免创建过多的 TCP 连接而导致昂贵的性能开销。

1.10 Virtual Host

虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离

RabbitMQ 通过虚拟主机来实现逻辑分组和资源隔离,一个虚拟主机就是一个小型的 RabbitMQ服务器,拥有独立的队列、交换器和绑定关系。用户可以按照不同业务场景建立不同的虚拟主机,虚拟主机之间是完全独立的,你无法将 vhost1 上的交换器与vhost2 上的队列进行绑定,这可以极大的保证业务之间的隔离性和数据安全,默认的虚拟主机名为 /

1.11Broker

简单来说就是消息队列服务器实体。

2. RabbitMQ安装

参考:RabbitMQ安装 - 晓风残月的博客

3. 如何使用RabbitMQ发送消息?

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

  1. 客户端连接到消息队列服务器,打开一个channel。
  2. 客户端声明一个exchange,并设置相关属性。
  3. 客户端声明一个queue,并设置相关属性。
  4. 客户端使用routing key,在exchange和queue之间建立好绑定关系。
  5. 客户端投递消息到exchange。

4. 消息怎么路由?

从概念上来说,消息路由必须有三部分:交换器路由绑定

生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。

消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定,通过队列路由键,可以把队列绑定到交换器上。

消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则),如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进入 "黑洞"。

RabbitMQ常用的交换器这篇文章里有详细介绍RabbitMQ常用交换器有哪些?_rabbitmq三种交换机-CSDN博客

相关推荐
浩哲Zhe5 小时前
RabbitMQ
java·分布式·rabbitmq
Allen Bright7 小时前
RabbitMQ中的Topic模式
分布式·rabbitmq
Allen Bright10 小时前
Spring Boot 整合 RabbitMQ:手动 ACK 与 QoS 配置详解
spring boot·rabbitmq·java-rabbitmq
一路狂飙的猪10 小时前
RabbitMQ的工作模型
分布式·rabbitmq
来一杯龙舌兰1 天前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
Allen Bright1 天前
Spring Boot 整合 RabbitMQ:从入门到实践
spring boot·rabbitmq·java-rabbitmq
bug_null2 天前
RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件
分布式·rabbitmq
kingbal2 天前
RabbitMQ:添加virtualHost
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--虚拟主机设计
分布式·rabbitmq
04Koi.2 天前
Java项目--仿RabbitMQ的消息队列--网络通信协议设计
分布式·rabbitmq