AMQP 协议介绍

 RabbitMQ 是遵从AMQP 协议的, 换句话说, RabbitMQ 就是AMQP

协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 、MQTT3 等协议) 0 AMQP 的模型架构
和RabbitMQ 的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定。当生产
者发送消息时所携带的RoutingKey 与绑定时的BindingKey 相匹配时,消息即被存入相应的队
列之中。消费者可以订阅相应的队列来获取消息。

RabbitMQ 中的交换器、交换器类型、队列、绑定、路由键等都是遵循的AMQP 协议中相
应的概念。目前RabbitMQ 最新版本默认支持的是AMQP 0-9-1 。本书中如无特殊说明,都以
AQMP 0-9-1 为基准进行介绍。

STOMP. 即Simple (or Stre阻úng) Text Oriented Messaging Protocol. 简单(流〕文本面向消息协议,它提供了一个可互操作的
连接格式,运行STOMP 客户端与任意STOMP 消息代理C Broker ) 进行交互。STOMP 协议由于设计简单, 易于开发客户端,
因此在多种语言和平台上得到广泛的应用.
MQTT. 即Message Queuing Telemetry Transport. 消息队列遥澳~传输,是ffiM 开发的一个即时通信协议,有可能成为物联网
的重要组成部分.该协议支持所有平台,几乎可以把所有物联网和外部连接起来,被用来当作传感器和制动器的通信协议。

AMQP 协议本身包括三层:

  • Module Layer: 位于协议最高层,主要定义了一些供客户端调用的命令,客户端可以利

用这些命令实现自己的业务逻辑。例如,客户端可以使用Queue . Declare 命令声明

一个队列或者使用Basic.Consume 订阅消费一个队列中的消息。

  • Session Layer: 位于中间层,主要负责将客户端的命令发送给服务器,再将服务端的应
    答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理。

  • Transport Layer: 位于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错
    误检测和数据表示等。

AMQP 说到底还是一个通信协议,通信协议都会涉及报文交互,从low-level 举例来说,
AMQP 本身是应用层的协议,其填充于TCP 协议层的数据部分。而从high-level 来说, AMQP
是通过协议命令进行交互的。AMQP 协议可以看作一系列结构化命令的集合,这里的命令代表
一种操作,类似于HTTP 中的方法(GET 、POST 、PUT 、DELETE 等) 。


 AMQP生产者流转过程

为了形象地说明AMQP 协议命令的流转过程,这里截取代码清单1-1 中的关键代码,如代
码清单2-2 所示。

代码清单2-2 简洁版生产者代码

Connection connection = factory .n ewConnection() ; //创建连接
Channel channel = connection.createChannel() ; //创建信道
String message = "Hello World! ";
channel.basicPublish(EXCHANGE NAME , ROUTING KEY ,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
//关闭资源
channel.close() ;
connection . close();

  

当客户端与Broker 建立连接的时候,会调用factory .newC onnection 方法,这个方法
会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker ,以此通知Broker 本次交互采用
的是AMQPO-9-1 协议,紧接着Broker 返回Connection.Start 来建立连接,在连接的过程

中涉及Connection.Start/.Start-OK 、Connection.Tune/.Tune-Ok , Connection.
Open/ .Open-Ok 这6 个命令的交互。
当客户端调用connection .createChannel 方法准备开启信道的时候,其包装
Channel . Open 命令发送给Broker ,等待Channel.Open-Ok 命令。
当客户端发送消息的时候,需要调用channel . basicPublish 方法,对应的AQMP 命
令为Basic.Publish ,注意这个命令和前面涉及的命令略有不同,这个命令还包含了Content
Header 和Content Body 0 Content Header 里面包含的是消息体的属性,例如,投递模式、优先级等,而Content Body 包含消息体本身。

当客户端发送完消息需要关闭资源时,涉及Channel.Close/.Close-Ok 与
Connection.Close/.Close-Ok 的命令交互。详细流转过程如图2-10 所示。

 

 

消费者的流转过程, 参考代码清单1-2 , 截取消费端的关键代码如代码清
单2-3 所示。
代码清单2-3 简洁版消费者代码

Connection connection = factory.newConnection(addresses);// 创建连接
final Channel channel = connection . createChannel() ; //创建信道
Consumer consumer = new DefaultConsumer(channel) ()//_省略实现
channel . basicQos(64) ;
channel.basicConsume(QUEUE NAME , consumer) ;
//等待回调函数执行完毕之后,关闭资源
TimeUnit . SECONDS . sleep(5) ;
channel . close();
connection.close();

  

其详细流转过程如图2-11 所示。

消费者客户端同样需要与Broker 建立连接,与生产者客户端一样,协议交互同样涉及
Connection.Start/ . Start-Ok 、Connection.Tune/.Tune-Ok 和Connection.
Open/ . Open-Ok 等,图2-11 中省略了这些步骤,可以参考图2-10 。
紧接着也少不了在Connection 之上建立Channe l,和生产者客户端一样,协议涉及
Channel . Open/Open-Oko
如果在消费之前调用了channel . basicQos(int prefetchCount) 的方法来设置消费
者客户端最大能"保持"的未确认的消息数,那么协议流转会涉及Basic.Qos/.Qos-Ok 这
两个AMQP 命令。
在真正消费之前,消费者客户端需要向Broker 发送Basic.Consume 命令(即调用
channel.basicConsume 方法〉将Channel 置为接收模式,之后Broker 回执
Basic . Consume - Ok 以告诉消费者客户端准备好消费消息。紧接着Broker 向消费者客户端推
送(Push) 消息,即Basic.Deliver 命令,有意思的是这个和Basic.Publish 命令一样会
携带Content Header 和Content Body 0
消费者接收到消息并正确消费之后,向Broker 发送确认,即Basic.Ack 命令。
在消费者停止消费的时候,主动关闭连接,这点和生产者一样,涉及
Channel . Close/ . Close-Ok 手口Connection.Close/ . Close-Ok 。

AMQP 命令概览

AMQP 0-9-1 协议中的命令远远不止上面所涉及的这些,为了让读者在遇到其他命令的时候
能够迅速查阅相关信息,下面列举了AMQP 0-9-1 协议主要的命令,包含名称、是否包含内容
体(Content Body) 、对应客户端中相应的方法及简要描述等四个维度进行说明,具体如表2-1
所示。

 

 

 

转载于:https://www.cnblogs.com/saryli/p/9735165.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java已死?九百万程序员说不

Java没死,事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上,总是和其他技术或者语言做些不公平的对比,这些语言并没有像Java一样得到广泛应用及长远的历史。 现在的小孩都能学Java,它在…

CSS中position的absolute和relative用法

static: HTML元素的默认定位方式absolute: 将对象从文档流中拖出,使用left,right,top,bottom等属性进行绝对定位。而其层叠通过z-index属性定义。绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父…

避免流量高峰期CDN问题的10个方法

在视频流媒体中,因平台火爆而出现问题是件好事。至少,这比根本没有观众要好。\\也许你正在使用世界级的CDN,但是,在大型赛事期间,当CDN的服务器和对等点流量变得饱和的时候,一些用户还是无法享受到流畅的体…

Android应用进入爆发期 手机游戏仍是市场重心

近日,91无线发布了《91无线移动应用发展趋势报告(Android版)》。报告显示,2012年,无论Android移动应用用户下载还是开发者研发均呈爆发态势,手机游戏仍是市场重心所在。同时,Android移动应用下载…

WebService中文件传输

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 WebService处理传递普通的信息,还可以传输文件,下面介绍WebService是怎么完成文件传输的。 1、 首先编写服务器端…

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验,比如验证用户是否输入,输入的长度和格式等是否正…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid2665 (POJ2104)http://poj.org/problem?id2104 (POJ2761)http://poj.org/problem?id2761 题意:求区间第K大&…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始,我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …

小米360口水战背后:国产手机第三态诞生

摘要&#xff1a;按照双方公布的配置信息&#xff0c;小米手机青春版为1.2G H z双核处理器&#xff0c;华为闪耀为1G H z双核。种向市场投入海量推广资金&#xff0c;以换取产品上的高利润&#xff0c;代表为步步高、金立、O PPO。南都制图&#xff1a;宋小伟 互联网入侵通信业…

线段与多边形的关系

转自周见智 介绍 最近项目中要用到有关几何&#xff08;Geometry&#xff09;方面的知识&#xff0c;程序需要判断给定的一条线段&#xff08;Segment&#xff09;与指定多边形&#xff08;Polygon&#xff09;的位置关系。这种关系分为三种&#xff1a;多边形包含线段、多边形…

解决,文件上传到 ftp 服务器,中文出现乱码问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 上传到 ftp 服务器&#xff0c;中文出现乱码解决&#xff0c;之前文件名 “ 网关信息 ” 始终不能正确显示&#xff0c;尝试了多种编码…

常用负载均衡策略分析

背景 一般生产环境单机所能承受的QPS压力为2w左右&#xff0c;过大的压力会导致服务器爆炸。即便是单机能够撑住2w QPS&#xff0c;一般也不会这么做&#xff0c;生产环境一般会预留50%的冗余能力&#xff0c;防止QPS因为某个热门的活动而爆炸。当QPS超过单机所能承受的压力时&…

解决- SecureCRT上运行 linux vim 命令中文出现乱码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 乱码如图&#xff1a; 这个问题是CRT的编码设置造成的&#xff0c;改一下设置就可以了&#xff1a; 1. 在当前连接上右键选择最后一个 2…

linux中操作数据库的使用命令记录

1&#xff0c;mysql 查看数据库表编码格式&#xff1a; show create table widget; 修改数据库表编码格式&#xff1a; alter table widget default character set utf8; 修改数据库表中某字段的编码格式&#xff1a; alter table widget change widget_name widget_name varc…

ICC Scenario Definition

现代先进工艺下的后端设计都是在 MCMM 情况下设计的&#xff0c;所谓 MCMM 就是 muti-corner muti-mode&#xff0c;用于芯片的不同工作模式和工作条件。 后端设计过程中&#xff0c;需要保证芯片在所有工作模式和工作条件下都能正常工作&#xff0c;工作模式一般只有几种&…

持续集成与持续部署宝典Part 2:创建持续集成流水线

2019独角兽企业重金招聘Python工程师标准>>> 在本系列文章中&#xff0c;我们将探讨在容器时代如何在基于Docker的环境中创建连贯的工作流程和流水线来简化大规模项目的部署。另外&#xff0c;我们还将详细介绍如何利用Docker和Rancher自动化处理这些工作流。 在上文…

64 装饰器函数: 母版 csrf防御机制 cookie

主要内容: 1: 装饰器函数 a: 原理: 在不改变原函数的代码和调用方式的情况下, 给函数动态的添加功能 b: 实例: 装饰器的原理: def yue(tools):print(使用%s约一约 % tools) def wrapper(fn):def inner(*args, **kwargs):print(先准备好钱)fn(*args, **kwargs)return inner yue …

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 方案一&#xff1a;用Eclipse自带的Export功能 步骤1&#xff1a;准备主清单文件 “MANIFEST.MF”&#xff0c; 由于是打包引用了第三…