RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2)

这篇具有很好参考价值的文章主要介绍了RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

+ - [1、AMQP是什么](#1AMQP_4)
	- [2、消息代理中间件的职责](#2_6)
+ [1.2 AMQP 0-9-1模型](#12_AMQP_091_10)
+ - [1、AMQP的工作过程](#1AMQP_11)
	- [2、交换器和交换器类型](#2_28)
	- [3、队列](#3_78)
	- * [队列属性](#_79)
		* [队列名称](#_92)
		* [队列持久化](#_96)
+ [1.3 几个概念](#13__100)
+ - [1、绑定](#1_101)
	- [2、消费者](#2_111)
	- [3、消息确认](#3_118)
	- [4、预取消息](#4_127)
	- [5、消息属性和有效载荷(消息主体)](#5_131)
	- [6、连接](#6_149)
	- [7、通道](#7_151)
	- [8、虚拟主机](#8_154)

1 AMQP协议

1.1 AMQP协议介绍

因为RabbitMQ是一种遵循AMQP协议的分布式消息中间件,RabbitMQ实现的AMQP版本是0.9.1,所以在此处简单了解一下AMQP-0-9-1 协议。

1、AMQP是什么

AMQP,全称Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议。它支持符合要求的客户端应用(application)和消息中间件代理(messaging middleware broker)之间进行通信。

2、消息代理中间件的职责

Messaging Broker,这里称为消息中间件代理。它会从发布者(Publisher,或者有些时候称为Producer,生产者)接收消息,并根据既定的路由规则把消息发送给处理消息的消费者(Consumer,或者有些时候称为Listener,监听者)。
因为消息中间件代理、发布者客户端和消费者客户端都是基于AMQP这一网络消息协议,所以消息中间件代理、发布者客户端和消费者客户端可以在不同的机器上,从而实现分布式通讯和服务解耦。
消息中间件代理不仅仅提供了消息接收和消息路由这两个基本功能,还有其他高级的特性如消息持久化功能、监控功能等等。

1.2 AMQP 0-9-1模型

1、AMQP的工作过程

RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式

AMQP的工作过程如下:

  • 1.消息(message)被发布者(publisher)发送给交换器(exchange),交换器常常被比喻成邮局或者邮箱。
    • a.发布者(publisher)发布消息时可以给消息指定各种消息属性(message meta-data)
    • b.有些属性有可能会被消息代理(brokers)使用 c.其他的属性则是完全不透明的,只能被接收消息的应用使用
  • 2.交换器将收到的消息根据路由规则分发给绑定的队列(queue)
    • a.在某些情况下,例如当一个消息无法被成功路由时,消息可能会被返回给发布者,也可能被丢弃
    • b.如果消息代理执行了延期操作,消息则会被放入一个死信队列中 c.针对以上两种情况,消息发布者可以选择某些参数来处理
  • 3.AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取
    • a.由于网络的不可靠性,接收消息的应用可能在处理消息的时候失败,为了防止应用处理失败,同时消息代理中又没有该消息,一般会启用”消息确认“。当“消息确认”被启用的时候,消息代理不会完全将消息从队列中删除,直到它收到来自消费者的确认回执(acknowledgement)。

消息确认(message acknowledgements):当一个消息从队列中投递给消费者后(consumer),消费者会通知一下消息代理(broker)。可以是自动的,也可以是处理消息的应用的开发者执行。
AMQP实体(AMQP entities):队列,交换器和绑定的统称

2、交换器和交换器类型

交换器是用来发送消息的AMQP实体。交换器拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换器类型和被称作绑定(bindings)的规则所决定的。
AMQP 0-9-1的代理提供了四种交换器:

Name(交换器类型) Default pre-declared names(预声明的默认名称)
Direct exchange(直连交换器) (Empty string) and amq.direct
Fanout exchange(扇型交换器) amq.fanout
Topic exchange(主题交换器) amq.topic
Headers exchange(头交换器) amq.match (and amq.headers in RabbitMQ)

在声明交换器时可以附带许多其他的属性,比较重要的有:

  • Name:交互器的名称
  • Type:交换器的类型
  • Durability :(交换器)持久化特性,如果启动此特性,则Broker重启后交换器依然存在,否则交换器会被删除
  • Auto-delete :是否自动删除,如果启用此特性,当最后一个队列解除与交换器的绑定关系,交换器会被删除。
  • Arguments:可选参数,一般配合插件或者Broker的特性使用

交换器状态:

  • 持久(durable):持久化的交换器会在消息代理(broker)重启后依旧存在。但是持久化的交换器不适用所有常见
  • 暂存(transient):暂存的交换器则不会(它们需要在代理再次上线后重新被声明)

几种交换器的对比:

  • 默认交换器:

    • 定义:实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换器(direct exchange)
    • 特殊属性:每个新建队列(queue)都会自动绑定到默认交换器上,绑定的路由键(routing key)名称与队列名称相同
  • 直连交换器:

    • 定义:根据消息携带的路由键(routing key)将消息投递给对应队列的
    • 处理对象:单播路由(unicast routing)
    • 工作过程:
      • 将一个队列绑定到某个交换器上,同时赋予该绑定一个路由键(routing key)
      • 当一个存在路由键为R的消息被发送给直连交换器时,交换器会把它路由给绑定值同样为R的队列。
    • 工作图:直连交换器路由图
      RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
  • 扇型交换器

    • 定义:将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键
    • 处理对象:广播路由(broadcast routing)
    • 工作过程:如果某个扇型交换器上绑定了n个队列,当有消息发送给此扇型交换器时,交换器会将消息的拷贝分别发送给所有的N个队列。
    • 案例:大规模多用户在线(MMO)游戏可以使用它来处理排行榜更新等全局事件
    • 工作图:扇形交换器路由图
      RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
  • 主题交换器

    • 定义:通过对消息的路由键和队列到交换器的绑定模式之间的匹配,将消息路由给一个或多个队列
    • 处理对象:多播路由
    • 使用场景:实现各种分发/订阅模式及其变种
    • 案例:
      • 由多个工作者(workers)完成的后台任务,每个工作者负责处理某些特定的任务
      • 涉及到分类或者标签的新闻更新(例如,针对特定的运动项目或者队伍)
  • 头交换器

3、队列
队列属性

AMQP中的队列(queue):存储即将被应用消费的消息。
队列也存在其他属性:

  • Name:队列名称
  • Durable:是否持久化,开启持久化意味着消息中间件代理重启后队列依然存在,否则队列会被删除
  • Exclusive:是否独占的,开启队列独占特性意味着队列只能被一个连接使用并且连接关闭之后队列会被删除。
  • Auto-delete:是否自动删除,开启自动删除特性意味着队列至少有一个消费者并且最后一个消费者解除订阅状态(一般是消费者对应的通道关闭)后队列会自动删除
  • Arguments:队列参数,一般和消息中间件代理或者插件的特性相关,如消息的过期时间(Message TTL)和队列长度等

队列需要被声明才能使用:

  • 如果一个队列不存在,声明队列会创建它
  • 如果声明的队列已经存在,并且属性相同,再次声明对原队列没有影响
  • 如果声明的队列已经存在,并且属性不相同,则会报错,报报错码为406
队列名称

队列的名字可以是消息代理(broker)生成,也可以是应用确定。队列命名有几个规则:

  • 队列名字是字符串,最多255字节,并且是utf-8编码
  • 以"amq."开始的队列名称被预留做消息代理内部使用
队列持久化

持久化队列(Durable queues)会被存储在磁盘上,当消息代理(broker)重启的时候,它依旧存在。没有被持久化的队列称作暂存队列(Transient queues)。并不是所有的场景和案例都需要将队列持久化。
队列的持久化特性并不意味着路由到它上面的消息是持久化的,也就是说**队列的持久化跟消息的持久化是两回事。**倘若消息代理挂掉了,重新启动,那么在重启的过程中持久化队列会被重新声明,无论怎样,只有经过持久化的消息才能被重新恢复。

1.3 几个概念

1、绑定

绑定(Binding)是交换机(exchange)将消息(message)路由给队列(queue)所需遵循的规则。

例如交换器E可以路由消息到队列Q,那么Q必须通过一定的规则绑定到E。绑定中使用的某些交换器的类型决定了它可以使用可选的路由键(RoutingKey)。路由键的作用类似于过滤器,可以筛选某些发布到交换器的消息路由到目标队列。

例如:

  • 队列:是要去的位于伦敦的目的地
  • 交换器:是国际机场ABC
  • 绑定:是国际机场ABC到伦敦的路线。能够到达目的地的路线可以是一条或者多条
    如果AMQP的消息无法路由到队列(例如,发送到的交换机没有绑定队列),消息会被就地销毁或者返还给发布者。如何处理取决于发布者设置的消息属性。
2、消费者

消费者用来接收发送者发送的消息,消费者一般是应用程序。消费者消费消息的这个操作的实现方式一般有两种:

  • 消息代理中间件向消费者推送消息(推模式push API,代表方法是basic.consume)。
    • 前提:消费者必须指定需要订阅的队列。每个队列可以存在多个消费者,或者仅仅注册一个独占的消费者。
  • 消费者主动向消息代理中间件拉取消息(拉模式 pull API,代表方法是basic.get)。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2),2024年程序员学习,rabbitmq,分布式

有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-DXTHq9Za-1712859427411)]文章来源地址https://www.toymoban.com/news/detail-853824.html

到了这里,关于RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ 消息队列(Spring boot AMQP)

    几种常见MQ的对比: RabbitMQ ActiveMQ RocketMQ Kafka 公司/社区 Rabbit Apache 阿里 Apache 开发语言 Erlang Java Java ScalaJava 协议支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定义协议 自定义协议 可用性 高 一般 高 高 单机吞吐量 一般 差 高 非常高 消息延迟 微秒级 毫秒级 毫秒级 毫

    2024年02月13日
    浏览(43)
  • RabbitMQ(基于AMQP的开源消息代理软件)

    (1)介绍 AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议 ,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

    2024年02月02日
    浏览(36)
  • 2023-07-06:RabbitMQ中的AMQP是什么?

    2023-07-06:RabbitMQ中的AMQP是什么? 答案2023-07-06: AMQP AMQP(Advanced Message Queuing Protocol)是一个应用层协议的开放标准,旨在设计面向消息的中间件。基于AMQP协议的客户端和消息中间件可以自由地传递消息,不受客户端、中间件产品或开发语言的限制。其目标是实现一种被广泛

    2024年02月12日
    浏览(50)
  • 理解RabbitMQ中的AMQP-0-9-1模型,全网最全

    Type:交换器的类型。 Durability:(交换器)持久化特性,如果启动此特性,则Broker重启后交换器依然存在,否则交换器会被删除。 Auto-delete:是否自动删除,如果启用此特性,当最后一个队列解除与交换器的绑定关系,交换器会被删除。 Arguments:可选参数,一般配合插件或者

    2024年04月26日
    浏览(40)
  • (一)RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理

    Lison dreamlison@163.com , v1.0.0 , 2023.06.22 RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用(最早是为了解决电信行业系统之间的可靠通信而设计)。 高可靠性、易扩展、高可用、功能丰富等 支持

    2024年02月15日
    浏览(49)
  • node-red:使用node-red-contrib-amqp节点,实现与RabbitMQ服务器(AMQP)的消息传递

    回到目录   AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。    AMQP的主

    2024年02月03日
    浏览(39)
  • 理解RabbitMQ中的AMQP-0-9-1模型(1),学web前端开发有前途

    消息中间件代理不仅仅提供了消息接收和消息路由这两个基本功能,还有其他高级的特性如消息持久化功能、监控功能等等。 AMQP-0-9-1模型的基本视图是:消息发布者消息发布到交换器(Exchange)中,交换器的角色有点类似于日常见到的邮局或者信箱。然后,交换器把 消息的副本

    2024年04月28日
    浏览(32)
  • 【漏洞修复】docker 环境下,AMQP Cleartext认证漏洞,rabbitmq明文漏洞修复,超详细

    目录 1、拷贝docker配置文件到本地 2、重新启动容器: 3、添加SSL插件: 4、查看启动结果 5、基于CMF-AMQP-Configuration来生成SSL自签名文件 6、使用JDK的Keytool工具,将服务器公钥转换为JKS格式 7、创建etc/rabbitmq/rabbitmq.conf(如果不存在) 8、添加证书登录用户 9、验证证书有效性 通过

    2024年02月05日
    浏览(36)
  • 解决Qpid与RabbitMQ端口冲突问题(epmd reports: node rabbit’ not running at all),RabbitMQ 3.11修改AMQP端口

    本文以Windows为例讲解如何修改Rabbit MQ默认端口,从而解决Qpid与Rabbit MQ冲突的问题。 RabbitMQ的默认端口如下: 4369 (epmd), 25672 (Erlang distribution) 5672, 5671 (AMQP 0-9-1 without and with TLS) 15672 (if management plugin is enabled) 61613, 61614 (if STOMP is enabled) 1883, 8883 (if MQTT is enabled) 其中AMQP端口5672与

    2023年04月24日
    浏览(47)
  • 史上最简单RabbitMQ中IO流异常的解决 org.springframework.amqp.AmqpIOException: java.io.IOException 超级简单

    org.springframework.amqp.AmqpTimeoutException: java.util.concurrent.TimeoutException     at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:73) ~[spring-rabbit-2.4.8.jar:2.4.8]     at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(Ab

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包