(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍

前言

因为项目组需要对RabbitMQ的使用进行优化,所以系统化的学习了RabbitMQ,写下本系列博客的目的是希望能帮助到后续使用RabbitMQ的同学少走弯路,在阅读本博客前我希望您已经对RabbitMQ有基本的了解。本篇博客主要面向JAVA开发人员,因此不会涉及到运维相关知识,该系列博客大致分为如下几个模块

1.RabbitMQ相关概念介绍
2.RabbitMQ Java Client使用
3.使用Spring AMQP整合RabbitMQ
4.使用@RabbitListener注解进行消息消费

5.RabbitMQ的异常处理
6.RabbitMQ消息可靠性保障
7.RabbitMQ的常用属性介绍
8.使用RabbitMQ进行异步RPC通信
9.使用SpringBoot整合RabbitMQ

本系列博客源码GIT地址:https://github.com/RobertoHuang/RGP-RABBITMQ.git

概念介绍

(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第1张图片
RabbitMQ的主要流程:生产者将消息发送到交换机,交换机根据不同路由规则将消息路由到已经绑定到该交换机且符合路由规则的队列中去,消费者通过监听队列来获取消息。注:交换机不存储消息,默认情况下消息如果没有被正确路由到相应队列,该消息将会被丢弃

消息

消息是服务器与应用程序之间传送的数据,由Properties和Payload(Body)组成,Message具有如下属性
(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第2张图片

属性名 属性描述
Routing key Routing key
Delivery mode 是否持久化 Persistent持久化 Non-persistent不持久化
Headers 头信息,是由一个或多个键值对组成的,是AMQP协议留给AMQP实现做扩展使用的
Properties AMQP提供的部分属性
Payload 消息体

队列

队列是消息的载体,每个消息都应该被投入一个或多个队列,Queue具有如下属性
(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第3张图片

属性名 属性描述
Virtual host 虚拟主机
Name 队列名称,同一个Virtual host下不能有相同的Name
Durability 是否持久化,Durable:是 Transient:否
Auto delete 如果该队列没有任何订阅的消费者的话,该队列会被自动删除
Arguments 参数,是AMQP协议留给AMQP实现做扩展使用的

绑定

RabbitMQ中的绑定通常是指交换机与队列的绑定关系(交换机与交换机绑定极少使用),Binding有如下属性
(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第4张图片

属性名 属性描述
To queue / To exchange 队列名称 / 交换机名称
Routing key Routing key
Arguments 路由参数(只有Headers Exchange是根据参数路由的,故只有Headers Exchange需要设置该参数)
Default Exchange不能进行Binding也不需要进行Binding

除了Default Exchange之外其他任何Exchange都需要和Queue进行Binding,否则无法进行消息路由

Direct Exchange、Topic Exchange进行Binding的时候需要指定Routing key

Fanout Exchange、Headers Exchange进行Binding的时候不需要指定Routing key

交换机

交换机的作用是接收生产者的消息,并将消息路由到已经绑定到该交换机且符合路由规则的队列中去。RabbitMQ定义了如下4种交换机:[直连交换机、扇形交换机、主题交换机、首部交换机],交换机有如下属性:
(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第5张图片

属性名 属性描述
Virtual host 虚拟主机
Name 交换机名称,同一个Virtual host下不能有相同的Name
Type 交换机类型
Durability 是否持久化,Durable:是 Transient:否
Auto delete 当最后一个绑定被删除后,该交换机将被删除
Internal 是否是内部专用exchange,是的话就意味着我们不能往exchange里面发送消息
Arguments 参数,是AMQP协议留给AMQP实现做扩展使用的

RabbitMQ内置一个名称为空字符串的默认交换机,它根据Routing key将消息路由到与队列名与Routing key完全相等的队列中

扇形交换机

(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第6张图片
扇形交换机(Fanout Exchange)会把能接受到的消息全部发送给绑定到自己身上的队列,扇形交换机在路由转发的时候忽略Routing Key。因为广播不需要思考所以扇形交换机处理消息的速度是所有交换机类型里面最快的

直连交换机

(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第7张图片
直连交换机(Direct Exchange)是一种带路由功能的交换机,它将消息中的Routing key与该交换机关联的所有Binding中的Routing key进行比较,如果完全相等则将消息发送到Binding对应的队列中,适用场景:根据任务的优先级把消息发送到对应的队列中,分配更多资源处理优先级高的队列

主题交换机

(一) RabbitMQ实战教程(面向Java开发人员)之RabbitMQ相关概念介绍_第8张图片
主题交换机(Topic Exchange)与直连交换机相比主题交换机的Routing key支持通配符,它将消息中的Routing key与该交换机关联的所有Binding中的Routing key进行比较,如果匹配上对应的匹配规则则将消息发送到Binding对应的队列中

*:匹配一个单词
#:匹配0个或多个单词

如果Binding中的Routing key不包含*,#,则表示相等转发,类似于Direct Exchange
如果Binding中的Routing key为#或者#.#,则表示全部转发,类似于Fanout Exchange

首部交换机

首部交换机(Headers Exchange)[不常用 了解即可]在进行路由转发的时候会忽略Routing Key,它将消息中的Headers与该交换机关联的所有Binding中的参数进行匹配,如果匹配上则将消息发送到Binding对应的队列中。它的匹配规则有下列两种类型

匹配规则
x-match = any则表示只要有键值对匹配就能转发消息
x-match = all则表示所有的键值对都匹配才能转发消息

注:Binding的时候至少需要指定两个参数,其中一个是x-match = all/any

由于本系列博客篇幅有限,所以不会对四种交换机的使用进行详细的扩展,只是点到为止

你可能感兴趣的:(RabbiMQ学习笔记)