ToB企服应用市场:ToB评测及商务社交产业平台

标题: RabbitMQ(三):AMQP协议 [打印本页]

作者: 嚴華    时间: 2024-10-30 09:58
标题: RabbitMQ(三):AMQP协议
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的工作过程如下:

消息确认(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) 在声明互换器时可以附带许多其他的属性,比较重要的有:

互换器状态:

几种互换器的对比:

3、队列

队列属性

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

队列须要被声明才能利用:

队列名称

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

队列持久化

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

1、绑定

绑定(Binding)是互换机(exchange)将消息(message)路由给队列(queue)所需遵照的规则。
例如互换器E可以路由消息到队列Q,那么Q必须通过肯定的规则绑定到E。绑定中利用的某些互换器的范例决定了它可以利用可选的路由键(RoutingKey)。路由键的作用类似于过滤器,可以筛选某些发布到互换器的消息路由到目的队列。
例如:

2、消费者

消费者用来接收发送者发送的消息,消费者一样平常是应用步伐。消费者消费消息的这个操纵的实现方式一样平常有两种:

每个消费者(订阅者)都有一个叫做消费者标签的标识符。它可以被用来退订消息。消费者标签现实上是一个字符串。
3、消息确认

利用消息中间件会存在一个问题:消费者应用步伐有可能在接收和处理消息的时间崩溃,也有可能因为网络缘故原由导致消息中间件署理投递消息到消费者的时间失败了,以是会有一个问题,AMQP消息中间件署理什么时间从队列中删除消息不会造成消息的丢失?AMQP 0-9-1规范提供了两种选择:

在显式模式下,由消费者应用来选择什么时间发送确认回执(acknowledgement),规定了AMQP消息署理未收到消费者回执后的操纵:

4、预取消息

预取消息(Prefetching Messages)是一个特性。假如多个消费者共享同一个队列,可以或许告知消息中间件署理在发送下一个确认之前指定每个消费者一次可以接收消息的消息量。
这个特性可以理解为简单的负载均衡技术,在批量发布消息的场景下可以或许提高吞吐量。
留意,RabbitMQ只支持通道级的预取计数,而不是连接级的大概基于巨细的预取。
5、消息属性和有效载荷(消息主体)

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

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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4