理解RabbitMQ中的AMQP-0-9-1模型,全网最全

这篇具有很好参考价值的文章主要介绍了理解RabbitMQ中的AMQP-0-9-1模型,全网最全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

之所以存在Durability和Auto-delete特性是因为并发所有的场景和用例都要求交互器是持久化的。

Direct交换器

Direct类型的交换器基于消息路由键(RoutingKey)把消息传递到队列中。Direct交换器是消息单播路由的理想实现(当然,用于多播路由也可以),它的工作原理如下:

  • 队列使用路由键K绑定到交换器。
  • 当具有路由键R的新消息到达交换器的时候,如果K = R,那么交换器会把消息传递到队列中。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

默认交换器

默认交换器(Default Exchange)是一种特殊的Direct交互器,它的名称是空字符串(也就是""),它由消息中间件代理预声明,在RabbitMQ Broker中,它在Web管理界面中的名称是(AMQP default)。每个新创建的队列都会绑定到默认交换器,路由键就是该队列的队列名,也就是所有的队列都可以通过默认交换器进行消息投递,只需要指定路由键为相应的队列名即可。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

Fanout交换器

Fanout其实是一个组合单词,fan也就是扇形,out就是向外发散的意思,Fanout交换器可以想象为"扇形"交换器。Fanout交换器会忽略路由键,它会路由消息到所有绑定到它的队列。也就是说,如果有N个队列绑定到一个Fanout交换器,当一个新的消息发布到该Fanout交换器,那么这条新消息的一个副本会分发到这N个队列中。Fanout交换器是消息广播路由的理想实现。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

Topic交换器

Topic交换器基于路由键和绑定队列和交换器的模式进行匹配从而把消息路由到一个或者多个队列。绑定队列和交换器的Topic模式(这个模式串其实就是声明绑定时候的路由键,和消息发布的路由键并非同一个)一般使用点号(dot,也就是’.')分隔,例如source.target.key,绑定模式支持通配符:

  • 符号’#'匹配一个或者多个词,例如:source.target.#可以匹配source.target.dogesource.target.doge.throwable等等。
  • 符号’*'只能匹配一个词,例如:source.target.*可以匹配source.target.dogesource.target.throwable等等。

对每一条消息,Topic交换器会遍历所有的绑定关系,检查消息指定的路由键是否匹配绑定关系中的路由键,如果匹配,则将消息推送到相应队列。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

Topic交换器是消息多播路由的理想实现。

Headers交换器

Headers交换器是一种不常用的交换器,它使用多个属性进行路由,这些属性一般称为消息头,它不使用路由键进行消息路由。消息头(Message Headers)是消息属性(消息元数据)部分,因此,使用Headers交换器在建立队列和交换器的绑定关系的时候需要指定一组键值对,发送消息到Headers交换器时候,需要在消息属性中携带一组键值对作为消息头。消息头属性支持匹配规则x-match如下:

  • x-match = all:表示所有的键值对都匹配才能接受到消息。
  • x-match = any:表示只要存在键值对匹配就能接受到消息。

Headers交换器也是忽略路由键的,只依赖于消息属性中的消息头进行消息路由。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

队列

AMQP 0-9-1模型中的队列与其他消息或者任务队列系统中的队列非常相似:它们存储应用程序所使用的消息。队列和交换器的基本属性有类似的地方:

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

一个队列只有被声明(Declare)了才能使用,也就是队列的第一次声明就是队列的创建操作(因为第一次声明的时候队列并不存在)。如果使用相同的参数再次声明已经存在的队列,那么此次声明会不生效(当然也不会出现异常)。但是如果使用不相同的参数再次声明已经存在的队列,那么会抛出通道级别的异常,异常代码是406(PRECONDITION_FAILED)。

队列名称

队列名必须由255字节(bytes)长度以内的UTF-8编码字符组成。实现AMQP 0-9-1规范的消息中间件代理具备自动生成随机队列名的功能,也就是在声明队列的时候,队列名指定为空字符串,那么消息中间件代理会自动生成一个队列名,并且在队列声明的返回结果中带上对应的队列名。

以"amq."开头的队列是由消息中间件代理内部生成的,有其特殊的作用,因此不能声明此类名称的新队列,否则会导致通道级别的异常,异常代码为403(ACCESS_REFUSED)。

队列的持久化特性

持久化的队列会持久化到磁盘中,这种队列在消息中间件代理重启后不会被删除。不开启持久化特性的队列称为瞬时(transient)队列,并非所有的场景都需要开启队列的持久化特性。

队列的持久化特性并不意味着路由到它上面的消息是持久化的,也就是队列的持久化跟消息的持久化是两回事。如果息中间件代理挂了,它重启后会重新声明开启了持久化特性的队列,这些队列中只有使用了消息持久化特性的消息会被恢复。

绑定

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

如果发布的消息没有路由到任意一个目标队列,例如,消息已经发布到交换器,交换器中没有任何绑定,这个时候消息会被丢弃或者返回给发布者,取决于消息发布者发布消息时候使用的参数。

消费者

如果队列只有发布者生产消息,那么是没有意义的,必须有消费者对消息进行使用,或者叫这个操作为消息消费,消息消费的方式有两种:

  • 消息代理中间件向消费者推送消息(推模式,代表方法是basic.consume)。
  • 消费者主动向消息代理中间件拉取消息(拉模式,代表方法是basic.get)。

使用推模式的情况下,消费者必须指定需要订阅的队列。每个队列可以存在多个消费者,或者仅仅注册一个独占的消费者。

每个消费者(订阅者)都有一个称为消费者标签(consumer tag)的标识符,消费者标签是一个字符串。通过消费者标签可以实现取消订阅的操作。

消息确认

消费者应用程序有可能在接收和处理消息的时候崩溃,也有可能因为网络原因导致消息中间件代理投递消息到消费者的时候失败了,这样就会催生一个问题:AMQP消息中间件代理应该在什么时候从队列中删除消息?因此,AMQP 0-9-1规范提供了两种选择:

  • 消息中间件代理向应用程序发送消息(使用AMQP方法basic.deliverbasic.get-ok)。
  • 应用程序收到消息后向消息中间件代理发送确认(使用AMQP方法basic.ack <= 个人感觉这个地方少写了basic.nackbasic.reject)

前一种称为自动确认模型(动作触发的同时进行了消息确认),后一种称为显式确认模型。显式确认模型中,需要消费者主动向消息中间件代理进行消息主动确认,这个消息主动确认动作的执行时机完全由应用程序控制。消息主动确认有三种方式:积极确认(ack)、消极确认(nack)和拒绝(reject)。

预取消息

预取消息(Prefetching Messages)是一个特性。对于多个消费者共享同一个队列的情况,能够告知消息中间件代理在发送下一个确认之前指定每个消费者一次可以接收消息的消息量。这个特性可以理解为简单的负载均衡技术,在批量发布消息的场景下能够提高吞吐量。

消息属性和有效负载

AMQP模型中,消息具有属性值。AMQP 0-9-1规范定义了一些常见的属性,一般开发人员不需要太关注这些属性:

  • Content type
  • Content encoding
  • Routing key
  • Delivery mode (persistent or not)
  • Message priority
  • Message publishing timestamp
  • Expiration period
  • Publisher application id

这些通用的属性一般是消息中间件代理使用的,还有可以定制的可选属性header,形式是键值对,类似于HTTP中的请求头。消息属性是在发布消息的时候设置的。

AMQP消息还有一个有效载荷(payload,其实就是消息数据体),AMQP代理将其视为不透明的字节数组,也就是AMQP代理不会检查或者修改消息的有效载荷。有些消息可能只包含属性而没有有效负载。通常使用序列化格式(如JSON,Thrift,Protocol Buffers和MessagePack)来序列化和结构化数据,以便将其作为消息有效负载发布。在一般约定下,消息属性中的Content typeContent encoding一般可以表明其序列化的方式。

消息发布支持消息的持久化特性,消息持久化特性开启后,消息中间件代理会把消息保存到磁盘中,如果重启代理消息也不会丢失。开启消息持久化特性将会影响性能,主要是因为涉及到刷盘操作。

AMQP-0-9-1方法

AMQP 0-9-1定义了一些方法,对应了客户端和消息中间件代理之间交互的一些操作方法,这些操作方法的设计跟面向对象编程语言中的方法没有任何共同之处。常用的交换器相关的操作方法有:

  • exchange.declare
  • exchange.declare-OK
  • exchange.delete
  • exchange.delete-OK

在逻辑上,上面几个操作方法在客户端和消息中间件代理之间的交互如下:

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

对于队列,也有类似的操作方法:

  • queue.declare
  • queue.declare-OK
  • queue.delete
  • queue.delete-OK

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

并非所有的AMQP操作方法都有响应结果操作方法,像消息发布方法basic.publish的使用是最广泛的,此操作方法没有对应的响应结果操作方法。有些操作方法可能有多个响应结果(操作方法),例如basic.get

连接(Connection)

AMQP的连接(Connection)通常是长期存在的。AMQP是一种使用TCP进行可靠传递的应用程序级协议。AMQP连接使用用户身份验证,可以使用TLS(SSL)进行保护。当应用程序不再需要连接到AMQP代理时,它应该正常关闭AMQP连接,而不是突然关闭底层TCP连接。

通道(Channel)

某些应用程序需要与AMQP代理程序建立多个连接。但是,不希望同时打开许多TCP连接,因为这样做会消耗系统资源并使配置防火墙变得十分困难。通道(Channel)可以认为是"共享一个单独的TCP连接的轻量级连接",一个AMQP连接可以拥有多个通道。

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

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

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

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

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

理解RabbitMQ中的AMQP-0-9-1模型,全网最全,程序员,rabbitmq,分布式

点击这里免费领取**

[外链图片转存中…(img-uYU1Wufy-1712378048552)]

[外链图片转存中…(img-2rLTkN96-1712378048553)]

[外链图片转存中…(img-7pZgZcS8-1712378048553)]文章来源地址https://www.toymoban.com/news/detail-858273.html

到了这里,关于理解RabbitMQ中的AMQP-0-9-1模型,全网最全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 全网最全c++中的system详解

    这篇文章是二发,做了些微调,感兴趣的朋友可以看原文:C++中的system_一只32汪的博客-CSDN博客 1,简介         system()函数是在C++制作中十分常用,有用的一个函数。         其效果类似于系统中\\\"cmd\\\"控制台和\\\"bat\\\"文件。         通常会在C++字符游戏,和C++整蛊程序中使

    2024年02月05日
    浏览(41)
  • C++ 窗体程序初步(全网最全)

    官方入门文档:[Create a traditional Windows Desktop application (C++)](https://docs.microsoft.com/en-us/cpp/windows/walkthrough-creating-windows-desktop-applications-cpp#:~:text=From the main menu%2C choose,Desktop Wizard then choose Next.) IDE的选择 窗体程序的开发我会推荐大家使用微软旗下的Microsoft Visual Studio 打开网页后下

    2024年02月04日
    浏览(38)
  • 全网最全Stable Diffusion原理快速上手,模型结构、关键组件、训练预测方式!!!!

    手把手教你入门绘图超强的AI绘画程序,用户只需要输入一段图片的文字描述,即可生成精美的绘画。给大家带来了全新保姆级教程资料包(文末可获取) 在这篇博客中,将会用机器学习入门级描述,来介绍Stable Diffusion的关键原理。目前,网络上的使用教程非常多,本篇中不

    2024年02月22日
    浏览(66)
  • flutter 中的动画详解 全网最全 动画一篇搞定 一万四千字

    学习 Flutter 中的动画和过渡是构建流畅用户界面的关键部分之一。这里我整理了一个主要的学习路径,可以帮助你逐步掌握 Flutter 中的动画和过渡技术,希望能够帮助到你 开始之前,了解一些基本的动画和过渡概念是很重要的。学习什么是动画、过渡,以及它们在用户体验中

    2024年01月18日
    浏览(42)
  • ChatGPT火爆全网!可以写代码、编剧本,它能取代程序员吗?

    近日,OpenAI 发布了一个全新的聊天机器人模型 ChatGPT,它拥有强大的文本生成能力,能够与用户对话,回答简单问题,甚至书写文章。ChatGPT 在世界范围内受到了广泛关注,引发了AI领域又一轮热潮。 虽然类似的聊天机器人并不少见,但 ChatGPT 一经发布迅速火爆全网,并收获

    2024年02月02日
    浏览(39)
  • RabbitMQ(三):AMQP协议_rabbitmq的amqp协议(2)

    1.1 AMQP协议介绍 因为RabbitMQ是一种遵循AMQP协议的分布式消息中间件,RabbitMQ实现的AMQP版本是0.9.1,所以在此处简单了解一下AMQP-0-9-1 协议。 1、AMQP是什么 AMQP,全称Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议。它支持符合要求的客户端应用(application)和

    2024年04月16日
    浏览(38)
  • 人工智能深度学习100种网络模型,精心整理,全网最全,PyTorch框架逐一搭建

    大家好,我是微学AI,今天给大家介绍一下人工智能深度学习100种网络模型,这些模型可以用PyTorch深度学习框架搭建。模型按照个人学习顺序进行排序: 深度学习模型 ANN (Artificial Neural Network) - 人工神经网络:基本的神经网络结构,包括输入层、隐藏层和输出层。 学习点击地

    2024年02月14日
    浏览(53)
  • Python圣诞树的最全画法!给你一个专属程序员的浪漫 !!

    11月末了,快到12月了,圣诞节不远了!今天教大家利用 Python 制作圣诞树和词云,教会你多种方法,代码直接运行即可,学会拿去送给你想要祝福的人吧~ 1. 圣诞树1号 【最新Python全套从入门到精通学习资源,文末免费领取!】 效果如下: 2. 圣诞树2号 效果如下: 还可以更改

    2024年01月18日
    浏览(59)
  • 史上最全最详细的Java架构师成长路径图,程序员必备

    从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚重的技术专家?本文将为你带来一张程序员发展路径图,但你需要知道的是,天下没有普适的道理,具体问题还需具体分析,实践才能出真知。 架构师的“内功” 我认为,架构师的内功主要包含三部分: 判

    2024年02月01日
    浏览(58)
  • uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

    用户需求:需要在填写表单信息时,在地图上标绘自己房屋的位置信息。 这个问题处理了很久,在网上也没有找到全面的相关案例,所以我将我的思路分享给大家,希望可以解决大家遇到的问题。如果大家有更好的思路,欢迎评论区留言,大家一起学习,共同进步! 实现最

    2024年02月04日
    浏览(107)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包