当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本。AMQP是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
当然这种降低耦合的机制是基于与上层产品,语言无关的协议。AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间异步、安全、高效地交互。从整体来看,AMQP协议可划分为三层:
这种分层架构类似于OSI网络协议,可替换各层实现而不影响与其它层的交互。AMQP定义了合适的服务器端域模型,用于规范服务器的行为(AMQP服务器端可称为broker)。在这里Model层决定这些基本域模型所产生的行为,这种行为在AMQP中用”command”表示,在后文中会着重来分析这些域模型。Session层定义客户端与broker之间的通信(通信双方都是一个peer,可互称做partner),为command的可靠传输提供保障。Transport层专注于数据传送,并与Session保持交互,接受上层的数据,组装成二进制流,传送到receiver后再解析数据,交付给Session层。Session层需要Transport层完成网络异常情况的汇报,顺序传送command等工作。
上面是对AMQP协议的大致说明。下面会以我们对消息服务的需求来理解AMQP所提供的域模型。消息中间件的主要功能是消息的路由(Routing)和缓存(Buffering)。在AMQP中提供类似功能的两种域模型:Exchange 和 Message queue。
Exchange接收消息生产者(Message Producer)发送的消息根据不同的路由算法将消息发送往Message queue。Message queue会在消息不能被正常消费时缓存这些消息,具体的缓存策略由实现者决定,当message queue与消息消费者(Message consumer)之间的连接通畅时,Message queue有将消息转发到consumer的责任。
Message是当前模型中所操纵的基本单位,它由Producer产生,经过Broker被Consumer所消费。它的基本结构有两部分: Header和Body。Header是由Producer添加上的各种属性的集合,这些属性有控制Message是否可被缓存,接收的queue是哪个,优先级是多少等。Body是真正需要传送的数据,它是对Broker不可见的二进制数据流,在传输过程中不应该受到影响。
一个broker中会存在多个Message queue,Exchange怎样知道它要把消息发送到哪个Message queue中去呢? 这就是上图中所展示Binding的作用。Message queue的创建是由client application控制的,在创建Message queue后需要确定它来接收并保存哪个Exchange路由的结果。Binding是用来关联Exchange与Message queue的域模型。Client application控制Exchange与某个特定Message queue关联,并将这个queue接受哪种消息的条件绑定到Exchange,这个条件也叫Binding key或是 Criteria。
在与多个Message queue关联后,Exchange中就会存在一个路由表,这个表中存储着每个Message queue所需要消息的限制条件。Exchange就会检查它接受到的每个Message的Header及Body信息,来决定将Message路由到哪个queue中去。Message的Header中应该有个属性叫Routing Key,它由Message发送者产生,提供给Exchange路由这条Message的标准。Exchange根据不同路由算法有不同有Exchange Type。比如有Direct类似,需要Binding key等于Routing key;也有Binding key与Routing key符合一个模式关系;也有根据Message包含的某些属性来判断。一些基础的路由算法由AMQP所提供,client application也可以自定义各种自己的扩展路由算法。那么一个Message的处理流程类似于这样:
在这里有个新名词需要介绍: Virtual Host。一个Virtual Host可持有一些Exchange和Message queue。它是一个虚拟概念,一个Virtual Host可以是一台服务器,也可以是由多台服务器组成的集群。同步扩展下,Exchange与Message queue的部署也可以是一台或是多台服务器上。
Message的产生者和消费者可能是同一个应用。整个AMQP定义的就是Client application与Broker之间的交互。在粗略介绍完AMQP的域模型后,可以关注下Client是怎样与Broker建立起连接的。
在AMQP中,Client application想要与Broker沟通,就需要建立起与Broker的connection,这种connection其实是与Virtual Host相关联的,也就是说,connection是建立在client与Virtual Host之间。可以在一个connection上并发运行多个channel,每个channel执行与Broker的通信,我们前面提供的session就是依附于channel上的。
这里的Session可以有多种定义,既可以表示AMQP内部提供的command分发机制,也可以说是在宏观上区别与域模型的接口。正常理解就是我们平时所说的交互context,主要作用就是在网络上可靠地传递每一个command。在AMQP的设计中,应当是借鉴了TCP的各种设计,用于保证这种可靠性。
在Session层,为上层所需要交互的每个command分配一个惟一标识符(可以是一个UUID),是为了在传输过程中可以对command做校验和重传。Command发送端也需要记录每个发送出去的command到Replay Buffer,以期得到接收方的回馈,保证这个command被接收方明确地接收或是已执行这个command。对于超时没有收到反馈的command,发送方再次重传。如果接收方已明确地回馈信息想要告知command发送方但这条信息在中途丢失或是其它问题发送方没有收到,那么发送方不断重传会对接收方产生影响,为了降低这种影响,command接收方设置一个过滤器Idempotency Barrier,来拦截那些已接收过的command。 关于这种重传及确认机制,可以参考下TCP的相关设计。
上面大致介绍了AMQP的域模型及连接机制中的确认及重传模型,不涉及AMQP的详细二进制规范。
参考:http://blog.csdn.net/zhangxinrun/article/details/6411841
快速理解Kafka分布式消息队列框架:
http://blog.csdn.net/colorant/article/details/12081909
Apache kafka原理与特性(转)
http://itindex.net/detail/50423-apache-kafka-%E5%8E%9F%E7%90%86
分享到:
相关推荐
使用 Java AMQP 协议订阅启用Partition 的 Azure ServiceBus Topic 在本文中,我们将讲解如何使用 Java AMQP 协议订阅启用Partition 的 Azure ServiceBus Topic,并解决在订阅启用Partition 的 Topic 时出现的常见...
1. **连接(Connection)**:AMQP协议的基础是网络连接,它定义了客户端如何建立和管理到服务器的TCP连接。连接过程中包括认证、心跳机制和异常处理等。 2. **会话(Session)**:在连接上建立的双向通道,用于管理...
研究生期间在做协议分析时留存的公开文档资料,内含lua脚本,.pacp包,协议文档,nmap探测命令等,以及相关的证明脚本留存,协议分析截图。适用于做网络安全的同学,物联网安全,车联网安全,了解协议分析的步骤,...
使用wireshark捕获AMQP协议的PCAP数据包进行分析
本规范针对具备相关经验的技术人员编写,同时也提供了足够的规范和指导,使得开发者能够理解和应用AMQP协议,构建高效、可靠的消息传递系统。 ##### 1.2 摘要 ###### 1.2.1 为什么使用AMQP? AMQP的主要目标是在...
JMS规范详情 AMQP协议详情 RocketMQ RabbitMQ Kafka ActiveMQ ......对比
AMQP(Advanced Message Queuing Protocol)是一种开放标准的协议,用于在不同的应用程序之间进行异步消息传递。这个“AMQP文档及PPT资料”压缩包显然包含了一系列关于AMQP的详细学习材料,非常适合那些希望深入理解...
随后,为了满足更多的业务需求和解决更广泛的问题,AMQP协议被进一步扩展和更新,形成了AMQP10版本。AMQP10由多个技术公司共同制定,包括Cisco Systems、Credit Suisse、Deutsche Börse Systems、Envoy ...
AMQP0-9 版本协议原文,协议为公开资源,供大家浏览学习;AMQP0-9 版本协议原文,协议为公开资源,供大家浏览学习;AMQP0-9 版本协议原文,协议为公开资源,供大家浏览学习;AMQP0-9 版本协议原文,协议为公开资源,...
rabbit的AMQP协议介绍
- "amqp" 是我们要讨论的核心技术,即AMQP协议,它允许不同的应用程序通过消息队列进行通信,提高系统的可伸缩性和解耦性。 - "php7.1" 是指PHP编程语言的7.1版本,这是一种广泛应用的服务器端脚本语言,尤其在Web...
amqp高级消息队列协议v1.0
AMQP协议是Advanced Message Queuing Protocol的简称,翻译成中文即为高级消息队列协议。它是一种开放标准的、应用层、异步消息传递协议,用于在不同系统之间进行可靠的消息交换。AMQP定义了客户端如何与消息代理...
rest-amqp 使用基于nodejs的amqp协议的Rest API 基于AMQP协议的主题交换库。 在高负载项目上使用RabbitMQ进行了测试。 ###安装RabitMQ apt-get安装rabbitmq-server ### sample.js中的示例代码var restAMQP = require...
描述中的"amqp-1.9.3"进一步确认了这是AMQP协议的一个特定版本,1.9.3可能包含了一些bug修复、性能优化或者新功能的添加。在开源软件项目中,版本号通常遵循语义化版本管理(Semantic Versioning),其中“1”代表主...
Spring AMQP是Spring框架的一个模块,它为开发者提供了基于AMQP协议的抽象层,使得在Java应用中处理消息变得简单。通过Spring AMQP,开发者可以利用AMQP的特性,如路由、交换机和队列,实现异步通信和解耦应用程序。...
JMeter AMQP采样器插件专为测试RabbitMQ等基于AMQP协议的服务设计,使得测试人员能够在JMeter环境中直接操作消息队列,进行发布、订阅、确认、拒绝等操作,从而评估MQ服务的性能和稳定性。 **安装与配置** 要使用...
RabbitMQ是一个开源的消息代理服务器,它基于AMQP协议工作,广泛应用于分布式系统中的任务调度、微服务通信以及错误处理等场景。通过安装amqp.so扩展,PHP程序员能够利用PHP语言直接操作RabbitMQ,发送和接收消息,...
如果您想加入他们,请考虑:AMQP运输 这是的实现。 它内部使用 。资源由Forma-Pro开发Forma-Pro是一家全栈开发公司,其兴趣也扩展到了开源开发。 作为一支由强大的专业团队组成的团队,我们的目标是通过在电子商务...
Spring AMQP(Advanced Message Queuing Protocol)允许开发者利用AMQP协议来构建可扩展、高可用的消息驱动系统。在这个版本中,它提供了一套全面的API和工具,帮助开发人员在Java应用中实现高效、可靠的异步通信。 ...