论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
RabbitMQ(三):AMQP协议
RabbitMQ(三):AMQP协议
嚴華
金牌会员
|
2024-10-30 09:58:25
|
显示全部楼层
|
阅读模式
楼主
主题
916
|
帖子
916
|
积分
2748
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的工作过程
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.directFanout exchange(扇型互换器)amq.fanoutTopic exchange(主题互换器)amq.topicHeaders 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的队列。
工作图:直连互换器路由图
扇型互换器
定义:将消息路由给绑定到它身上的所有队列,而不剖析绑定的路由键
处理对象:广播路由(broadcast routing)
工作过程:假如某个扇型互换器上绑定了n个队列,当有消息发送给此扇型互换器时,互换器会将消息的拷贝分别发送给所有的N个队列。
案例:大规模多用户在线(MMO)游戏可以利用它来处理排行榜更新等全局事故
工作图:扇形互换器路由图
主题互换器
定义:通过对消息的路由键和队列到互换器的绑定模式之间的匹配,将消息路由给一个或多个队列
处理对象:多播路由
利用场景:实现各种分发/订阅模式及其变种
案例:
由多个工作者(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)。
每个消费者(订阅者)都有一个叫做消费者标签的标识符。它可以被用来退订消息。消费者标签现实上是一个字符串。
3、消息确认
利用消息中间件会存在一个问题:消费者应用步伐有可能在接收和处理消息的时间崩溃,也有可能因为网络缘故原由导致消息中间件署理投递消息到消费者的时间失败了,以是会有一个问题,AMQP消息中间件署理什么时间从队列中删除消息不会造成消息的丢失?AMQP 0-9-1规范提供了两种选择:
当消息署理(broker)将消息发送给应用后立即删除。(利用AMQP方法:basic.deliver或basic.get-ok) → 这种模式又称自动确认模式(automatic acknowledgement model)
待应用(application)发送一个确认回执(acknowledgement)后再删除消息。(利用AMQP方法:basic.ack) → 这种模式又称显式确认模式(explicit acknowledgement model)
在显式模式下,由消费者应用来选择什么时间发送确认回执(acknowledgement),规定了AMQP消息署理未收到消费者回执后的操纵:
1.应用可以在收到消息后立即发送,可以将未处理的消息存储后发送,也可以比及消息被处理完毕后再发送确认回执。
2.假如一个消费者在尚未发送确认回执的情况下挂掉了,那AMQP署剖析将消息重新投递给另一个消费者。假如当时没有可用的消费者了,消息署剖析死等下一个注册到此队列的消费者,然后再次尝试投递。
4、预取消息
预取消息(Prefetching Messages)是一个特性。假如多个消费者共享同一个队列,可以或许告知消息中间件署理在发送下一个确认之前指定每个消费者一次可以接收消息的消息量。
这个特性可以理解为简单的负载均衡技术,在批量发布消息的场景下可以或许提高吞吐量。
留意,RabbitMQ只支持通道级的预取计数,而不是连接级的大概基于巨细的预取。
5、消息属性和有效载荷(消息主体)
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(发布应用的ID)
AMQP的消息除属性外,也含有一个有效载荷 - Payload(消息现实携带的数据),它被AMQP署理看成不透明的字节数组来对待。
消息署理不会查抄大概修改有效载荷。消息可以只包含属性而不携带有效载荷。
常利用序列化格式(如JSON,Thrift,Protocol Buffers和MessagePack)来序列化和结构化数据,以便将其作为消息有效负载发布。在一样平常约定下,消息属性中的Content type和 Content encoding一样平常可以表明其序列化的方式。
消息发布支持消息的持久化特性,消息持久化特性开启后,消息中间件署剖析把消息生存到磁盘中,假如重启署理消息也不会丢失。开启消息持久化特性将会影响性能,主要是因为涉及到刷盘操纵。
6、连接
AMQP连接通常是长连接。AMQP是一个利用TCP提供可靠投递的应用层协议。AMQP利用认证机制而且提供TLS(SSL)掩护。当一个应用不再须要连接到AMQP署理的时间,须要优雅的释放掉AMQP连接,而不是直接将TCP连接关闭。
7、通道
有些应用须要与AMQP署理建立多个连接。但是,同时开启多个TCP连接都是不合适的,因为如许做不仅会消耗掉过多的体系资源,同时会使得防火墙的配置更加困难。AMQP 0-9-1提供了通道(channels)来处理多连接,可以把通道理解成共享一个TCP连接的多个轻量化连接。
在涉及多线程/进程的应用中,为每个线程/进程开启一个通道(channel)是很常见的,而且这些通道不能被线程/进程共享,每个特定的通道和其他通道是相互隔离的,每个实行的AMQP操纵方法(包罗相应)都携带一个通道的唯一标识,如许客户端就能通过该通道的唯一标识得知操纵方法是对应哪个通道发生的。
8、虚拟主机
为了在一个单独的署理上实现多个隔离的情况(用户、用户组、互换机、队列 等),AMQP提供了一个虚拟主机(virtual hosts - vhosts)的概念。这为AMQP实体提供了完全隔离的情况。当连接被建立的时间,AMQP客户端可以在连接消息中间件署理时指定须要连接的虚拟主机。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
嚴華
金牌会员
这个人很懒什么都没写!
楼主热帖
【万能皆可链接】C++中的动态链接库编 ...
iOS全埋点解决方案-用户标识 ...
用uniapp实现微信小程序的电子签名效果 ...
MySQL实战45讲 20
【云服务器】推荐阿贝云服务器,目前永 ...
【Javaweb】Web工作原理、两种网页、两 ...
【Selenium+Pytest+allure报告生成自动 ...
Qt-FFmpeg开发-打开本地摄像头(6) ...
Spring Boot 配置文件
微服务介绍
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表