RabbitMQ学习笔记:核心概念和AMQP协议

什么是AMQP高级消息队列协议?

  • AMQP全称:Advanced Message Queuing Protocol(翻译:高级消息队列协议);
  • AMQP定义:
  1. 是具有现代特征的二进制协议;
  2. 是一个提供统一消息服务的应用层标准高级消息队列协议;
  3. 是应用层协议的一个开放标准,为面向消息的中间件设计;
  • AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
  • AMQP协议模型:
  1. 生产者应用服务端 =》将消息扔到server端(rabbitmq的节点)上,Virtual host虚拟主机,其实就是一个上层路由逻辑的概念,Exchange也就是更上一级的AMQP协议的核心;生产者将消息投递到Server的Exchange交换机上。(消息投递要经过服务连接用户名,密码,ip地址 再经过虚拟主机Virtual host,最后投递到具体的Exchange)。
  2. 消费者应用服务端 =》监听Message Queue(消息队列);Binding => Exchange 和 Message Queue(MQ)又有一个绑定关系,MQ是具体消息的载体;

生产者将消息投递到交换机上,一个交换机可以绑定多个消息队列,交换机有一个路由策略,指定两个属性:
1、消息发送哪个exchange;
2、消息带上路由key,exchange和队列Binding绑定关系,通过路由key将消息路由到指定队列上,发送给消费者; 

AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。
JMS是早期消息中间件进行标准化的一个尝试,它仅仅是在API级进行了规范,离创建互操作能力还差很远。
与JMS不同,AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。

AMQP规范的版本:
0-8        是2006年6月发布
0-9        于2006年12月发布
0-9-1     于2008年11月发布
0-10      于2009年下半年发布
1.0 draft  (文档还是草案)

AMQP协议实现有哪些?

1)OpenAMQ 【http://freshmeat.sourceforge.net/projects/openamq

AMQP的开源实现,用C语言编写,运行于Linux、AIX、Solaris、Windows、OpenVMS。

2)Apache Qpid 【https://qpid.apache.org/

Apache的开源项目,支持C++、Ruby、Java、JMS、Python和.NET。

3)Redhat Enterprise MRG 【https://access.redhat.com/documentation/en-us/red_hat_enterprise_mrg/3/

实现了AMQP的最新版本0-10,提供了丰富的特征集,比如完全管理、联合、Active-Active集群,有Web控制台,还有许多企业级特征,客户端支持C++、Ruby、Java、JMS、Python和.NET。

4)RabbitMQ https://www.rabbitmq.com/documentation.html

一个独立的开源实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。

支持的系统和平台/Operating Systems and Platforms

5)AMQP Infrastructure 【https://fedoraproject.org/wiki/Features/AMQP_Infrastructure

Linux下,包括Broker、管理工具、Agent和客户端。

6)ØMQ 【https://zeromq.org/

一个高性能的消息平台,在分布式消息网络可作为兼容AMQP的Broker节点,绑定了多种语言,包括Python、C、C++、Lisp、Ruby等。

7)Zyre 【】

是一个Broker,实现了RestMS协议和AMQP协议,提供了RESTful HTTP访问网络AMQP的能力。

基于AMQP协议实现了7种消息中间间,业界选择RabbitMQ的比较多,其中的优劣就不在赘述,我们这个系列的学习重点是RabbitMQ,在开始介绍之前,我们先来理解一下AMQP协议。

AMQP核心概念是什么?

  • Publisher:消息生产者,即投递消息的程序;
  • Connection:publisher/consumer 和 broker 之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题;
  • Server:又称Broker,接受客户端的连接,实现AMQP实体服务(接收和分发消息的应用,RabbitMQ Server就是Message Broker);
  • Channel:网络通信,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道(消息流转,清空消息,添加用户等),客户端可建立多个Channel,每个Channel代表一个会话任务(拿到连接,创建channel);如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销;
  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟投递等高级特性,Body则是消息体内容;
  • Exchange:交换机,接收消息,message到达broker的第一站,根据分发规则,匹配查询表中路由键(routing key)转发消息到绑定的队列(Queue)上;常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast);
  • Binding:绑定,Exchange和Queue之间的虚拟连接,binding中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的分发依据,作用就是把 Exchange 和 Queue 按照路由规则绑定起来;
  • Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息;
  • Queue:消息的载体,也称为Message Queue(消息队列),消息最终被送到这里等待consumer(消费者)取走。一个message可以被同时拷贝到一个或多个queue中;
  • Consumer:消息消费者,即接收消息的程序;

【参考文章】

猜你喜欢

转载自blog.csdn.net/ChaITSimpleLove/article/details/109062216