当前各种应用大量使用异步消息模型,并随之产生众多消息中间件产品及协议,标准的不一致使应用与中间件之间的耦合限制产品的选择,并增加维护成本。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的详细二进制规范。

java amqp_AMQP协议相关推荐

  1. Java URL协议扩展实现

    2019独角兽企业重金招聘Python工程师标准>>> Java URL协议扩展实现 博客分类: java 在信息交互系统设计中,不乏有自定义通讯协议设计.本章会介绍如何利用 jav ...

  2. 小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...

    你这么优秀,一定只想把"柠檬班"置顶 ▲ → 性能3期优秀作业 利用lr的java vuser协议完成 (登录,md5加密完成重置支付密码,获取订单列表)请求,并加if判断完善脚本 ...

  3. java相关协议_java相关网络协议是什么

    能够有效保证我们上网安全的就是网络协议,那么java相关网络协议是什么?了解网络安全常识,首先就要了解佰佰安全网小编就带您认识一下吧. 1.概述 Java通过协议获取网络数据或者从设备上获取设备数据的 ...

  4. java modbus协议

    概念 Modbus是一种串行通信协议,Modbus协议目前存在用于串口.以太网以及其他支持互联网协议的网络的版本. 大多数Modbus设备通信通过串口EIA-485物理层进行. 通讯格式 地址域 功能 ...

  5. java,UDP协议简单实现

    //UDP协议简单实现-----Serverpackage UDP;import java.net.DatagramPacket; import java.net.DatagramSocket; im ...

  6. Java UDP协议传输

    使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是"Hello, world''. 接收端: 1 import java.net.*; 2 public ...

  7. java soap协议头_自己调用webservice方法总结(带请求头SoapHeader)

    调用webservice总结:1.加入第三方的jar包 Ksoap2-android-XXX2.访问响应的webservice的网站,查看响应的信息,得到nameSpace,methodName,ur ...

  8. java obix_obix协议在java中的配置和使用详解

    前言 本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 什么是 oBIX? 简单来讲,obix是一种 XML 通讯协议, ...

  9. Java—— TCP协议(相关代码实现以及相关优化)

    代码运行的时候先运行服务端,然后在运行客户端 * TCP协议:* 1,客户端* 创建Socket连接服务器(指定IP地址,端口号)通过IP地址找到对应的服务器* 调用Socket的getInputSt ...

最新文章

  1. 克服汽车摄像头连接挑战
  2. Swift - 可编辑表格样例(可直接编辑单元格中内容、移动删除单元格)
  3. 《分布式系统:概念与设计》一1.3 分布式系统的趋势
  4. oracle utf8 varchar,Oracle中字符集的类型决定varchar2的字符长度
  5. 博客教程中百度网盘地址
  6. 麦森数(洛谷-P1045)
  7. YOLOv4 | 用C++ 和OpenCV 实现视频目标检测
  8. linux shell 试题,linux-shell 练习题
  9. 德勤元宇宙综观:愿景、技术和应对
  10. Linux系统的日志服务器syslogd
  11. 查找业务对应的IDOC类型(HELP)
  12. xposed框架安装使用教程(第一篇)
  13. 华为谷歌安装器 Android6.0,gms安装器华为
  14. 出版印刷纸张大小尺寸一览表
  15. 9860测量程序(最后结果)1
  16. Android 一个String字符串 设置不同的颜色值
  17. mac地址修改_全球首款支持电脑名称和MAC地址修改的浏览器 VMLogin超级防关联指纹浏览器 同时支持模拟真人输入,支持自定义经纬度...
  18. 打造金融科技新生态,巨杉数据库与宇信科技完成产品兼容互认证
  19. 英首相:比起无协议脱欧 国会阻挠脱欧可能性更高
  20. can总线linux程序,CAN通信卡的Linux设备驱动程序 - 嵌入式操作系统 - 电子发烧友网...

热门文章

  1. python3.7.2版本怎么安装ipython_Linux升级安装python2.7版本至python3.6版本,系统centos7...
  2. go waitgroup.done()异常处理_Go 异常处理
  3. Java黑皮书课后题第5章:**5.45(统计:计算平均值和标准方差)在商务应用中……编写一个程序,提示用户输入10个数字,然后运用下面的公式,显示这些数字的平均值以及标准方差
  4. 通过JAVA对HDFS进行操作管理插件
  5. 被调用的对象已与其客户端断开连接
  6. @Transactional注解事务不回滚不起作用无效
  7. 【源码学习之spark core 1.6.1 各种部署模式所使用的的TaskSceduler及SchedulerBackend】...
  8. Google分布式系统三驾马车: GFS,mapreduce,Bigtable
  9. C# 对Outlook联系人的增、删、查
  10. [基础题]8.(*)按如下要求编写Java程序:(1)定义一个交通工具收费接口Charge