AMQP
AMQP,即Advanced Message Queuing Protocol,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。主要实现有 RabbitMQ。
基本概念
- 生产者
消息的创建者,负责将消息发送到RabbitMQ。
- 消费者
消息者需要连接到RabbitMQ,并且订阅到队列上,进行消息的接收。包括持续订阅(basicConsumer)和单条订阅(basicGet).
- 消息
消息包含两部分内容有效负荷(payload)和标签(label)。有效负荷就是传输的数据,标签就是路由键。
- 信道
信道是建立在TCP连接上的一个虚拟连接,虚拟连接相当于在多线程环境下,每个线程都共享一个TCP连接,一个线程对应着一个信道。
在RabbitMQ中,每个信道都有自己唯一的ID,保证了信道的私有性。
为什么不建立多个TCP连接呢?
原因是RabbitMQ为了保证性能。如果为每个线程创建一个TCP连接,每秒成百上千的连接建立和销毁会严重消耗系统的性能。所以RabbitMQ选择建立多个信道,而不是建立多个TCP连接。
- 交换器、队列、绑定、路由键
队列通过路由键(routing key,某种确定的规则)绑定到交换器,生产者将消息发布到交换器,交换器根据绑定的路由键将消息路由到特定队列,然后由订阅这个队列的消费者进行接收。
虚拟主机
虚拟消息服务器(vhost),是一个mini版的RabbitMQ,将RabbitMQ做了逻辑分离。每个vhost有自己的交换器和队列,避免了队列和交换器的命名冲突。而最重要的是具有权限控制机制。vhost在客户端连接时,必须指定,缺省的vhost为 “/” ,可以通过用户和口令guest进行访问。
什么情况下使用虚拟主机?
例如,公司内部搭建了一个RabbitMQ集群服务。由于我们需要开发环境、测试环境和演示环境,由于公司分配的服务器数量有限,我们不可能为每个环境都搭建一个集群服务,所以可以为每个环境创建一个虚拟主机。从而达到了环境隔离的目的。
总结
最后用一张图来说明生产者、消费者、信道、交换器、队列、虚拟主机之间的关系。