AMQP:Advanced Message Queuing Protocol(高级消息队列协议),下面主要介绍与其相关的几个常见术语:
1、Server(broker):接受客户端的链接,实现AMQP消息队列和路由的进程。
2、Virtrual Host:一批交换机、消息队列和相关对象的集合。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用程序在登录到服务器之后,可以选择一个虚拟主机。
3、Exchange:交换机,用来接受生产者发送的消息,并根据Binding的规则将消息路由给服务器中的消息队列(Message Queue),其中交换机的类型决定了路由消息的行为。
4、Message Queue:消息队列,用来保存未被消费者消费的消息。
5、Message:消息,由Header和Body组成,Header是由生产者添加的各种属性集合,包括Message是否要持久化、有哪个Message Queue接受、优先级等。而Body是真正需要传输的APP数据。
6、Binding:绑定,Binding联系了Exchange和Message Queue。Exchange在与多个Message Queue发生绑定后会生成一张路由表,这个路由表保存着每个Message Queue所要接受什么样消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,然后,Exchange根据Routing Key和Exchange Type将Message路由到Message Queue。Binding Key 是由消费者(Consumer)在绑定(Binding)Exchange和Message Queue时指定的,而Routing Key是由生产者(Producer)在发送Message是指定的,两者匹配的方式是由Exchange Type决定的。
7、Connection:链接,对于RabbitMq而言,其实就是一个位于客户端与Broker(Server)之间的TCP链接。
8、Channel:通道,多路复用连接中的一条独立的双向数据流通道,为会话提供物理传输介质。仅仅创建了客户端到与Broker之间的连接后,客户端还是不能发送消息的,需要为每个Connection创建一个Channel,AMQP规定只有通过Channel才能执行AMQP的命令。一个Connection可以有多个Channel,之所以需要Channel,是因为TCP连接的建立和释放是十分昂贵的,如果客户端的每一个线程都要与Broker交互,如果每一个线程都要建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒创建如此多的链接。RabbitMQ建议客户端线程之间不要公用Channel,至少要保证共享用Channel的线程发送消息必须是串行的,但是建议尽量公用Connection。
9、Command:命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。
10、Producer:生产者,一个向Exchange发送消息的客户端应用程序。
11、Consumer:消费者,一个从Message Queue中获取消息的客户端应用程序。
在了解了AMQP模型后,需要简单介绍下AMQP的协议栈,AMQP协议本身包含三层:
1、Module Layer:位于协议最高层,主要定义了一些供客户端调用的命令,客户端可以利用这些命令实现自己的业务逻辑,例如,客户端可以通过queue.declare声明一个队列,利用consume命令获取一个队列中的消息。
2、Session Layer:主要负责将客户端的命令发送给服务器,在将服务器端的应答返回给客户端,主要为客户端与服务器之间通信提供可靠性、同步机制和错误处理。
3、Transport Layer:主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示。