概述

Rabbitmq是消息中间件的一种落地开源实现,使用Erlang语言编写,基于AMQP消息协议。

核心概念
  • Message:消息是不具名的,由消息头和消息体组成,消息体是不透明的,也就是可以设置、查看消息体,消息头由一系列可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(设置是持久化消息还是非持久化消息)等。
  • Publisher:消息生产者,也就是向交换机发送消息的客户端程序。
  • Exchange:交换器,用于接收生产者发送的消息并将这些消息路由到服务器队列中。Exchange有四种类型,direct(默认)、fanout、topic、headers,不同类型的Exchange的路由策略有所不同。
  • Queue:消息队列,用于保存消息直到发送给消费者,它是消息的容器,也是消息的终点,一个消息可以进入多个队列中,消息会一直在队列里面,等待消费者连接到这个队列将其取走。
  • Binding:绑定,用于消息队列和交换器直接的关联,一个绑定就是基于路由键将消息队列和交换器连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。Exchange和Queue是多对多关系,一个交换器可以绑定多个队列,一个队列可以绑定多个交换器。
  • Connection:网络连接。TCP连接。
  • Channel:信道,多路复用连接中的一条独立的双向数据量通道,信道是建立在真实的TCP连接内的虚拟连接,AMQP命令是通过信道发送出去的,不管是发送消息、订阅队列还是接收消息等等,这些动作都是通过信道完成的,因为对于操作系统来说,建立和销毁TCP连接都是昂贵的开销,所以引用信道概念,复用TCP连接。
  • Consumer:消费者,消费消息,表示从消息队列中获取消息的客户端程序。
  • Virtual Host:虚拟主机,表示一批交换器、队列等相关对象的集合,本质上是一个mini版的RabbitMQ服务器,用于自己的队列、交换器、绑定和权限机制,虚拟主机是AMQP概念的基础,必须在连接时指定,默认的虚拟主机是/,虚拟主机以路径方式表示。类似于名称空间或者java里面的package,还有开发环境等。主要是用于提高硬件资源利用率,实现权限和资源隔离和权限控制,不同的VHost可以有同名的exchange和queue,他们之间完全透明。
  • Broker:表示消息服务器实体,就是一个Rabbit服务端进程。
Rabbitmq工作流程

  1. 消息生产者发布消息到Rabbitmq服务器Broker。
  2. 由指定的交换机接收,交换机接收根据交换机的类型,根据消息的路由键,把消息路由到对应的队列中。
  3. 消息消费者到指定队列获取消息。
交换器的类型

Exchange分发消息根据类型的不同分发策略有区别,目前有四种类型,direct、fanout、topic、headers,headers匹配AMQP消息的消息头(header)而不是路由键,header交换器与direct交换器能达到的效果完全一致,但是性能差很多,目前几乎不用了,所以直接讲另外三种类型:

direct交换器

消息中的路由键如果和交换器和队列的的binding中的bindingkey一致(完全一致),交换器就将消息发到对应的队列中,属于点对点的单播模式。

Fanout交换器

每个发到fanout类型交换器的消息,都会分到所有绑定队列上去,就是这种类型的交换器,不会管啥路由键的,消息总是发送到该交换器绑定的所有队列中。很像子网广播,每个队列都获得了一份复制的消息。fanout转发消息是最快的。

Topic交换器

Topic交换器是一种通过路由键进行模式匹配分配消息的。将路由键与某个模式进行匹配,此时队列要绑定到一个模式上面,他将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开,它同样会识别两个通配符:#:匹配0个或者多个单词(单词,不是字符),* 匹配一个单词。

死信、死信交换器、死信队列

消息变成死信的原因(队列要通过参数x-dead-letter-exchange设置死信交换器后,死信才会进入死信交换器,最后进入死信队列):

  1. 被消费者拒绝。
  2. 消息过期了。
  3. 队列达到最大长度后。x-overflow参数的值必须不能是reject-publish,否则就不会进入死信交换机。

死信交换器和死信队列实际上是普通的交换器和普通的队列,只是他的用途被定义为了死信队列。

消息的流转过程:

延迟队列的实现概述

这里只讲大概思路,具体会有一篇实战经验文章来就具体描述。
思路一:利用死信队列实现延时队列,比如一个队列要延时30分钟,那么可以往rabbitmq发送一个延时消息,过期时间为30分钟,然后改队列要指定死信交换器和死信队列,然后消费者消费死信队列,因为30分钟过期,然后会进入死信队列给消费者消费,就实现了30分钟的延时。

思路二:生产者程序设置定时器30分钟后发送消息。

思路三:使用rabbitmq-delayed-message-exchange插件实现延时队列(目前只找到linux的实现)。

Web界面基本操作

了解web界面的基本操作,对rabbitmq的工作流程会有更加熟悉的理解和使得将来使用对应客户端API操作时也可以更加的得心应手。

交换器操作
交换器添加

  1. Name:交换器名称。
  2. Type:交换器类型,有四种类型,direct、fanout、topic、headers。
  3. Durability:设置交换器的持久性类型,就持久性(Durable)和非持久性(Transient),如果为非持久性,则该交换器会在rabbitmq服务器重启后被删除。
  4. Auto delete:是否自动删除,条件是从有到无,就是有至少一个队列或者交换器与该交换器绑定过,后来这些所以的队列或者交换器都解除绑定了,然后就会自动删除该交换器。从来没有绑定过的话,就不会被自动删除。
  5. Internal:是否为内部交换器,如果是,那他就只能用于服务器内部的轮转路由,而不能与客户端交互。
  6. Arguments:可选参数,web界面会在下面列出可选的参数选项,交换器只有一个alternate-exchange,表示设置备用交换器,当原交换器无法进行消息的路由,就使用备用交换机进行路由。比如某个路由键使用原交换机不能路由到队列,就会尝试使用备用交换机。

这些设置完后,点击添加。

交换器绑定

点击某个交换机,进入交换机详情页。

  1. To Queue 或者 To Exchange :设置把该交换器与队列绑定还是与另一个交换器绑定,如果与交换器绑定,就是绑定多重交换器。值填写交换器的名字或者队列名。
  2. Routing Key:应该称为绑定键(binding key)更形象,就是该交换器与队列或者另一个交换器绑定时设置的绑定键,然后与消息的路由键进行一定规则的匹配,看是否要将消息路由到该队列或者交换器。
在交换器详情页发布消息

该操作是把消息发送到该交换器中进行路由。

  1. Routing key:消息的路由键,用于给交换器进行路由匹配。
  2. Headers:消息头,可以为任意值。
  3. Properties:设置消息的参数。不符合的参数名设置会被忽略掉。有效的参数如下:
  • content_type:消息的内容类型。
  • content_encoding:消息的内容编码规则。
  • priority:消息的优先级,0-255,同一队列优先级高的消息先被消费。
  • correlation_id:关联Id,用于RPC模式给生产者返回消费结果的关联ID,消费者关联生产者的消息的Id。
  • reply_to:RPC模式下消费者给生产者返回结果的发送队列。
  • expiration:消息的过期时间。
  • message_id:消息的id,一般由服务器给定,也可以给自定义唯一的消息id,用于实现解决消息重复消费等问题。
  • timestamp:消息发送的时间。
  • user_id:消息发送者的id。
  • app_id:消息发送的应用程序(消息生产者)id。
  • cluster_id:集群的Id
  1. Payload:消息体,也就是消息的内容。
删除该交换器

队列操作

  1. Type:队列的类型,有两种,Classic典型队列,quorum仲裁队列,3.8版本以后出来,暂时还没理解具体用途。
  2. Name:名称。
  3. Durability:队列的持久性设置。
  4. Auto delete:如果设置为yes,也是从有到无的过程,就是该队列曾经有一个以上的消费者连接上来,然后这些消费者全都断开连接,就自动删除该队列。
  5. Arguments:队列参数:
  • x-message-ttl:消息从进入队列开始,如果经过x-message-ttl时间内还没被消费,就过期被丢弃,如果队列配有死信交换器,并且路由能匹配上,就把消息交给死信交换器。单位毫秒。
  • x-expires:队列多久没被使用(没有消费者连接)就会被自动删除,单位毫秒。
  • x-max-length:该队列的最大消息数,如果达到最大消息数后,新消息进来,默认删除最早(队列头)的消息。
  • x-max-length-bytes:该队列消息的最大总大小,单位字节,只计算消息体,如果超出了大小然后有新消息进来,默认删除最早(队列头)的消息。
  • x-overflow:超出限制的处理模式,就是上面两个参数x-max-length、x-max-length-bytes设置到达时的处理模式,如果不设置,则默认删除队列头消息,可选项:drop-head(删除队列头消息), reject-publish(新消息拒绝入队) or reject-publish-dlx(拒绝消息,并把消息交到死信交换器),仲裁队列只支持drop-head。
  • x-dead-letter-exchange:设置该队列的死信交换器。
  • x-dead-letter-routing-key:设置死信消息的路由键,如果不设置,则使用原消息的路由键。
  • x-single-active-consumer:设置是否只允许单一消费者连接该队列,如果是,并且已经有了一个消费者连接,就拒绝其他消费者连接。
  • x-max-priority:设置队列支持的最大消息优先级。0-255,往该队列发布消息时可以设置消息的优先级,消息优先级高的消息优先被消费。如果队列不设置该参数,表示该队列不支持消息优先级。
  • x-queue-mode:开启懒加载模式,值为lazy,如果设置了该参数,该队列的消息需要时才从磁盘进行加载到内存,以达到节省内存空间使用效果,但是降低了效率,如果不设置,该参数,则该队列的消息会在rabbitmq启动时就全部加载到内存中。
队列绑定交换器

点击相应队列进入队列详情页:

From exchange: 要绑定的交换器的名字,只能绑定交换器。
Routing key: binding key,绑定键。

在队列中发布消息

此时发布的消息不过交换器,直接进入该队列。

Delivery mode:设置消息为持久消息还是非持久消息,非持久消息在rabbitmq服务器重启后被删除,Non-persistent非持久化消息,Persistent持久化消息。

Headers和Properties与上面交换器发布消息一致。
Payload:消息体,消息具体内容。
这里不用设置路由键,因为该消息直接进入到队列,无需路由,但是该消息会被设置默认路由键为该队列的队列名。

删除消息

获取/消费消息:

注意,消费消息是一个破坏性的不可逆操作,因为消费了消息,该消息就会从队列中被删除。

Ack Mode: 消息的确认模式,有四种:Nack message requeue true 批量拒绝消费消息并把消息重新入队;ack message requeue false 确认消息不重新入队;reject requeue true 拒绝消费消息并把消息重新入队;reject requeue false 拒绝消息,但不重新入队。
Encoding:消息编码。对消息体的编码方式。
Messages:获取的消息数量。

消息中间件Rabbitmq核心概念讲解相关推荐

  1. RabbitMQ核心概念及基础API应用

    RabbitMQ核心概念及基础API应用 1 主流中间件介绍 衡量消息中间件的指标:服务性能,数据存储,集群架构. 1.ActiveMQ:Apache,支持JMS规范最完整的. 2.RocketMQ ...

  2. 入门RabbitMQ核心概念

    这里mark一下 发送者开启 confirm 确认机制 spring.rabbitmq.publisher-confirm-type=correlated 发送者开启 return 确认机制 spri ...

  3. RabbitMQ核心概念和AMQP协议(二)

    RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...

  4. 消息中间件RabbitMQ核心1

    介绍 RabbitMQ是面向消息而设计的.遵循高级消息队列协议(AMQP)的分布式消息中间件.Erlang语言开发.同时内置管理控制台. 应用: 异步通信 接口限流 服务解耦 消息分发 业务延迟处理 ...

  5. RabbitMQ核心概念

    AMQP的四个主要概念 1.虚拟主机(virtual host)或(vhost) 2.交换机(exchange) 3.队列(queue) 4.绑定器(bind) 什么是虚拟主机? 一组交换机.队列和绑 ...

  6. 线性回归之核心概念讲解

      要想学好线性回归,我们首先要理解好回归的概念.那什么是回归呢? 文章目录 线性回归 一.相关理论基础 1.1 线性 1.2 极大似然估计 二.线性回归 定义: 线性模型优劣: 2.1 线性回归模型 ...

  7. RocketMQ的核心概念讲解

  8. Go秒杀系统——RabbitMQ核心概念与工作模式

    前言

  9. [RabbitMQ]RabbitMQ概念_四大核心概念

    RabbitMQ RabbitMQ 的概念 RabbitMQ 是一个消息中间件:它接受并转发消息.你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收 ...

最新文章

  1. zabbix 客户端安装
  2. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
  3. mysql同步 触发器_mysql 触发器(数据库的同步)
  4. redis的通用命令 || redis持久化机制:(RDB  ||  AOF)
  5. 前端框架-Bootstrap
  6. ITK:创建一个向量
  7. php 获取时间段 今天昨天本周上周本月上月本季度本年去年
  8. 数据库-优化-数据库可以从哪几方面进行优化
  9. 使用百度UEditor
  10. 2017.3.31 spring mvc教程(六)转发、重定向、ajax请求
  11. 关于链表的简单创建和遍历
  12. oracle数据库恢复备份步骤
  13. VMProtect修复导入表的插件
  14. 2023年中国矿业大学会计专硕考研经验
  15. python全套视频免费教程_《python免费视频教程33》 请问谁有靠谱的Python全套视频教程,求推荐分享...
  16. 怎么快速学习App后台开发
  17. 机器学习-马尔可夫随机场(MRF)
  18. python 文件夹_使用python进行文件夹对比
  19. JavaScript-197:模拟京东快递单号查询案例
  20. Flask 消息提示与异常处理

热门文章

  1. Django案例:显示图书信息
  2. TF1与TF2的求和程序对比
  3. linux服务器的诗句迁移,使用scp命令在两台linux上对拷文件或者文件夹
  4. bzoj1041 [HAOI2008]圆上的整点 gcd
  5. 【英语学习】【WOTD】countermand 释义/词源/示例
  6. 【英语学习】【WOTD】cerebral 释义/词源/示例
  7. sap idoc生成文件传到别的服务器,IDOC 实例详解
  8. 职称计算机excel2015年,【2015年职称计算机Excel重点精讲:创建数据透视表】- 环球网校...
  9. linux下判断网络是否连接
  10. 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)