RabbitMQ-AMQP协议
什么是AMQP协议
为了让消息在各个消息队列平台之间互融互通,最开始是通过JMS,通过JMS视同通过Java API的方式隐藏MQ产品供应商提供的实际接口,解决互通问题。从技术上讲java应用程序只需要针对JMS API编程选择适合的MQ驱动即可,
JMS会打理好其他部分,ActiveMQ就是JMS的实现。不过尝试使用单独标准化接口来胶合众多不同的接口最终会暴露出问题。使得应用程序变得更加脆弱。
2006年6月由于Cisco、Redhat、iMatix等联合制定了AMQP的公开标准,它是应用层协议的一个开放标准。rabbit就基于AMQP的关键协议进行实现。
AMQP架构模型 生产者通过routing key投递消息到exchage exchage根据routingKey与binding key映射 路由到投递到具体队列。
AMQP协议三层定义
AMQP协议本身包括三层。
Module Layer:位于协议最高层,主要定义了一些供客户端调用的命令,客户端可以利
用这些命令实现自己的业务逻辑。例如, 客户端可以使用Queue.Declare命令声明
一个队列或者使用Basic.Consume订阅消费一个队列中的消息。
Session Layer:位于中间层, 主要负责将客户端的命令发送给服务器, 再将服务端的应
答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理。
Transport Layer:位于最底层,主要传输二进制数据流,提供帧的处理、信道复用、错
误检测和数据表示等。
AMQP说到底还是一个通信协议, 通信协议都会涉及报文交互, 从low-level举例来说,
AMQP本身是应用层的协议, 其填充于TCP协议层的数据部分。而从high-level来说, AMQP
是通过协议命令进行交互的。AM QP协议可以看作一系列结构化命令的集合, 这里的命令代表
一种操作, 类似于HTTP中的方法(GET、POST、PUT、DELETE等) 。
AMQP生产者交互过程
Connection connection= factory.new Connection() ; //创建连接 Channel channel =connection.create Channel() ; //创建信道 String message="HelloWorld!"; channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes(); //关闭资源 channel.close() ; connection.close() ;
1.当调用factory.newConnection()
这个方法会进一步分支成Protocol Header 0-9-1的报文发送给Broker 通知Broker本次交互采用的是AMQP 0-0-1协议
Broker返回Conneciton.start来建立连接,在连接过程中涉及Connection.Start/.Start-OK、.Tune-Ok、Connection.Open/.Open-Ok命令
2.当调用connection.creatChannel方法开启信道的时候
这个方法会发送Channel.Open命令发送给Broker 等待Channel.Open-Ok命令
3.当调用chanel.basicPubilish的时候
会对应发送AMQP命令Basic.Publish 包含了Header和ContentBody
ContentBody包含发送内容 Header包含消息体的属性如投递模式 优先级等
4.channel.close和 connection.close
对应AMQB Channel.Close Conneciton.Close
AQMP消费者消费交费过程
Connection connection=factory.new Connection(addresses) ; //创建连接 final Channel channel=connection.create Channel() ; //创建信道 Consumer consumer=new Default Consumer(channel){}//.....省略实现 channel.basic Qos(64) ; channel.basic Consume(QUEUE_NAME, consumer) ; //等待回调函数执行完毕之后,关闭资源 Time Unit.SECONDS.sleep(5) ; channel.close() ; connection.close() ;
1.首先跟生产者一样 先与broker建立连接和再连接上创建channel
2.如果在消费之前调用了channel.basicQos方法设置消费最大保持未确认消息数量那么协议会涉及Basic.Qos/.Qos-ok这2个AMQP命令
3.调用channel.basicConsumer会像Broker发送Basic.Consumer命令将Channel设置为接收模式
4.之后Broker回执Basic.Consumer-Ok告诉消费者客户端准备好消费消息
5.紧接着Broker向消费者客户端推送消息即Basic.Deliver 携带ContentHeader和Content Body
5.消费者接受到消息并征求消费后向Broker发送确认Basic.Ack命令
6.消费停止消息channel和连接和生产者一样