CodeAshen's blog CodeAshen's blog
首页
  • Spring Framework

    • 《剖析Spring5核心原理》
    • 《Spring源码轻松学》
  • Spring Boot

    • Spring Boot 2.0深度实践
  • Spring Cloud

    • Spring Cloud
    • Spring Cloud Alibaba
  • RabbitMQ
  • RocketMQ
  • Kafka
  • MySQL8.0详解
  • Redis从入门到高可用
  • Elastic Stack
  • 操作系统
  • 计算机网络
  • 数据结构与算法
  • 云原生
  • Devops
  • 前端
  • 实用工具
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • Reference
GitHub (opens new window)

CodeAshen

后端界的小学生
首页
  • Spring Framework

    • 《剖析Spring5核心原理》
    • 《Spring源码轻松学》
  • Spring Boot

    • Spring Boot 2.0深度实践
  • Spring Cloud

    • Spring Cloud
    • Spring Cloud Alibaba
  • RabbitMQ
  • RocketMQ
  • Kafka
  • MySQL8.0详解
  • Redis从入门到高可用
  • Elastic Stack
  • 操作系统
  • 计算机网络
  • 数据结构与算法
  • 云原生
  • Devops
  • 前端
  • 实用工具
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • Reference
GitHub (opens new window)
  • RabbitMQ

    • 第01章-RabbitMQ导学
    • 第02章-入门RabbitMQ核心概念
      • 2.1 AMQP 定义
      • 2.2 AMQP 协议模型
      • 2.3 AMQP 核心概念
      • 2.4 RabbitMQ 整体架构与消息流转
      • 3.1 消息生产与消费
      • 4.1 Exchange 概念图解
      • 4.2 交换机属性
      • 4.3 交换机类型
        • 4.3.1 Direct Exchange
        • 4.3.2 Direct Exchange
        • 4.3.3 Fanout Exchange
      • 5.1 Binding - 绑定
      • 5.2 Queue - 消息队列
      • 5.3 Message - 消息
      • 5.4 Virtual host - 虚拟主机
    • 第03章-RabbitMQ高级特性
    • 第04章-RabbitMQ高级整合
    • 第05章-高可靠RabbitMQ集群架构
  • RocketMQ

  • Kafka

  • Nginx

  • 中间件
  • RabbitMQ
CodeAshen
2023-02-10
目录

第02章-入门RabbitMQ核心概念

本章内容包括,RabbitMQ 的高性能之道是如何做到的?什么是 AMQP 高级协议?AMQP 核心概念是什么?RabbitMQ 整体架构模型是什么样子的?RabbitMQ 消息是如何流转的?RabbitMQ 安装与使用命令行与管控台,RabbitMQ 消息生产与消费,RabbitMQ 交换机详解,RabbitMQ 队列、绑定、虚拟主机、消息等...

# 一、RabbitMQ 高性能的原因

  • Erlang 语言最初用于交换机领域的架构模式,这样使得 RabbitMQ 在 Broker 之间进行数据交互的性能是十分优秀的
  • Erlang 的优点:Erlang 有着和原生 Socket 一样的延迟

# 二、AMQP 高级消息队列协议与模型

# 2.1 AMQP 定义

AMQP全称:Advanced Message Queuing Protocol(高级消息队列协议)。

AMQP定义:AMQP 是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息对下列协议,是一个应用层协议的一个开放标准,为面向消息的中间件设计。

# 2.2 AMQP 协议模型

image-20200711150958903

生产者(Publisher application)将消息投递到 Server 端,到达 Exchange 上。消费者(Consumer application)监听 Message Queue,拿到消息进行消费。

其中 Exchange 和 Message Queue 有一定的绑定关系。

# 2.3 AMQP 核心概念

  • Server:又称 Broker,接受客户端的连接,实现 AMQP 实体服务。
  • Connection:连接,应用程序与 Broker 的网络连接。
  • Channel:网络信道,几乎所有的操作都在 Channel 中进行,Channel 是进行消息读写的通道。客户端可以建立多个 Channel,每个 Channel 代表一个会话任务。
  • Message:消息,服务器和应用程序之间传送的数据,由 Properties 和 Body 组成。Properties 可以对消息进行修饰,比如消息的优先级、延迟等高级特征;Body 则就是消息的内容。
  • Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个 Virtual host 里面可以有若干个 Exchange 和 Queue,同一个 Virtual host 里面不能有相同名称的 Exchange 和 Queue。
  • Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列。
  • Binding:Exchange 和 Queue 之间的虚拟连接,binding 中可以包含 routing key(路由键)。
  • Routing key:一个路由规则,虚拟机可以用它来确定如何路由一个特定的消息。
  • Queue:可称为 Message Queue,消息队列,保存消息并将它们转发给消费者。

# 2.4 RabbitMQ 整体架构与消息流转

  • RabbitMQ 整体架构

    image-20200711152946005

    生产者值关注把消息投递到指定的 Exchange,消费者只需要监听指定的队列。Exchange 和 Queue 之间有一个绑定的关系。

  • RabbitMQ 消息流转图

    image-20200711153234650

    生产者将 Message 投递到 Exchange 上,一个 Exchange 可以绑定多个 Message Queue,Exchange 根据路由 key,将消息路由到指定的队列上,消费者监听指定的队列,进行消息消费。

# 三、RabbitMQ 快速入门

# 3.1 消息生产与消费

  • ConnectionFactory:获取连接工厂
  • Connection:一个连接
  • Channel:数据通信信道,可发送和接收消息
  • Queue:具体的消息存储队列
  • Producer & Consumer:生产者和消费者

示例代码

# 四、Exchange 交换机详解

Exchange:接收消息,并根据路由键转发消息到所绑定的队列

# 4.1 Exchange 概念图解

img

  • 蓝框:Send Message 过程,表示 Client 端将消息投递到 Exchange 上,通过路由关系路由到指定的队列
  • 绿框:Receive Message 过程,表示 Client 跟队列建立的监听,去接收消息
  • 红框:Rabbit Server
  • 黄框:RoutingKey 和绑定关系,Exchange 和队列要建立绑定关系,消息到达 Exchange 后投递到哪个队列由 RoutingKey 决定

# 4.2 交换机属性

  • Name:交换机名称
  • Type:交换机类型 direct、topic、fanout、headers
  • Durability:是否需要持久化,true 为持久化
  • Auto Delete:当最后一个绑定到 Exchange 上的队列删除后,自动删除该 Exchange
  • Internal:当前 Exchange 是否用于 RabbitMQ 内部使用,默认为 false
  • Arguments:扩展参数,用于扩展 AMQP 协议自制定化使用

# 4.3 交换机类型

# 4.3.1 Direct Exchange

直连方式的 Exchange。

所有发送到 Direct Exchange 的消息被转发到 RoutingKey 中指定的 Queue。

注意:Direct 模式可以使用 RabbitMQ 自带的 Exchange:default Exchange,所以不需要将 Exchange 进行任何绑定(binding)操作,消息传递时,RoutingKey 必须完全匹配才会被队列接收,否则该消息会被抛弃。

image-20200711202355004

示例代码

# 4.3.2 Direct Exchange

所有发送到 Topic Exchange 的消息被转发到所有关心 RoutingKey 中指定 Topic 的 Queue 上

Exchange 将 RoutingKey 和某 Topic 进行模糊匹配,此时队列需要绑定一个 Topic。

注意:模糊匹配可以使用通配符

“#” 匹配一个或多个词 “*” 匹配不多不少一个词

如:"log.#" 能匹配到 "log.info.oa", "log.*" 只能匹配到 "log.err"

image-20200711210038672

示例代码

# 4.3.3 Fanout Exchange

不处理路由键,只需要简单地将队列绑定到交换机上;

发送到交换机的消息都会被转发到与交换机绑定的队列上;

Fanout 交换机转发消息是最快的。

image-20200711220646402

示例代码

# 五、绑定、队列、消息、虚拟主机详解

# 5.1 Binding - 绑定

  • Exchange 和 Exchange、Queue 之间的连接关系
  • Binding 中可以包含 RoutingKey 或者参数

# 5.2 Queue - 消息队列

消息队列,实际存储消息数据

  • Durability:是否持久化,Durable:是,Transient:否
  • Auto delete:如选 yes,代表当最后一个监听被移除之后,该 Queue 会自动被删除

# 5.3 Message - 消息

服务器和应用程序之间传送的数据

本质上就是一段数据,由 Properties 和 Payload(Body)组成

常用属性:delivery mode(持久化模式)、headers(自定义属性)

其他属性:

content_type、content_encoding、priority(优先级)

correlation_id(唯一id)、reply_to、expiration(过期时间)、message_id(消息id)

timestamp、type、user_id、app_id、cluster_id

示例代码

# 5.4 Virtual host - 虚拟主机

虚拟地址,用于进行逻辑隔离,最上层的消息路由

一个 Virtual host 里面可以有若干个 Exchange 和 Queue

同一个 Virtual host 里面不能有相同名称的 Exchange 和 Queue

编辑 (opens new window)
上次更新: 2023/06/04, 12:34:19
第01章-RabbitMQ导学
第03章-RabbitMQ高级特性

← 第01章-RabbitMQ导学 第03章-RabbitMQ高级特性→

最近更新
01
第01章-RabbitMQ导学
02-10
02
第03章-RabbitMQ高级特性
02-10
03
第04章-RabbitMQ高级整合
02-10
更多文章>
Theme by Vdoing | Copyright © 2020-2023 CodeAshen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式