聚焦RabbitMQ:AMQP

1.1 简介

AMQP全称是Advanced MessageQueuing Protocol (高级消息队列协议)。

AMQP是一个应用层的异步消息传递协议,为面向消息的中间件而设计。其目的是通过协议使应用模块之间或应用程序与中间件等进行充分解耦。而在设计初期,AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议。现在已经有相当一部分遵循AMQP的服务器和客户端供使用。其中RabbitMQ是AMQP的一款开源标准实现。

06年初AMQP协议发布,06年底RabbitMQ1.0版本发布

1.2 概念

AMQP 有四个非常重要的概念:虚拟机(virtual host),交换器(exchange),队列(queue)和绑定(binding)。

虚拟机(virtual host): 通常是应用的外在边界,我们可以为不同的虚拟机分配访问权限。虚拟机可持有多个交换器、队列和绑定。

vhost作用:

a.逻辑分离允许为不同应用程序安全保密的运行数据,将rabbit的众多客户区分开来,避免队列和交换器的命名冲突;

b.权限控制以vhost为单位;

c.vhost之间是绝对隔离的,无法将vhost1上的交换器绑定到vhost2中的队列去;

d.可以安全的迁移到新的RabbitMQ服务器上处理新的负载,不会有任何命名冲突

e.vhost不仅消除了在基础架构中为每一层都运行一个RabbitMQ服务器,也避免了为每一层创建不同集群

交换器(exchange): 从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。

队列(queue): 消息最终的存储容器,直到消费客户端(Consumer)将其取走。

绑定(binding): 也就是所谓的路由规则,告诉交换器将何种类型的消息发送到某个队列中。

1.3 协议

AMQP协议是一个二进制协议,拥有一些现代特点:多信道、协商式、异步、安全、跨平台、中立、高效。

AMQP协议分为三层:

ModelLayer:模型层规范服务器和Broker行为,定义了一套命令(按功能分类),客户端应用可以利用这些命令来实现它的业务功能。

Session Layer:会话层定义客户端与服务器端Broker的上下文,负责将命令从客户端应用传递给服务器,再将服务器的应答传递给客户端应用,会话层为这个传递过程提供可靠性、同步机制和错误处理

Transport Layer:传输二进制数据流,传输层提供帧处理、信道复用、错误检测和数据表示。

1.4 AMQP模型

支持所有消息中间件的功能:消息交换、文件传输、流传输、远程进程调用等。

AMQP的服务器(Broker)主要由交换器、消息、队列组成。Broker的主要功能是消息的路由和缓存。对于需要保障可靠性的消息,RabbitMQ可以将消息、队列和交换器的数据写入本地硬盘。而对于响应时间敏感的消息,RabbitMQ可以不配置持久化机制。

交换器(Exchange)接受来自生产者的消息,并根据不同路由算法将消息发送到消息队列。

消息队列(Message Queue)在消息没有被消费者消费时将其缓存,当消费者与消息队列连接时,消息队列会把消息转发给消费者。不过也可以将一个队列配置为这样:一旦消息进入这个队列,此消息就会被删除。

消息(Message)是AMQP通信的基本因素。消息由Header和Body组成。与TCP/IP协议类似,Header包含的是各种属性信息,Body是真正传输的数据。

交换器与消息队列的关联通过Binding实现。交换器与多个消息队列Binding后会形成一张“路由表”,其中存储的信息包括消息队列的限制条件即Binding Key。交换器收到消息时会解析其Header中的Routing Key,根据交换类型(Exchange Type)将消息路由到消息队列。

1.5 解决的问题

1)信息的发送者和接收者如何维持这个连接,如果一方的连接中断,这期间的数据如何防止丢失?

2)如何降低发送者和接收者的耦合度?

3)如何让Priority高的接收者先接到数据?

4)如何做到load balance?有效均衡接收者的负载?

5)如何有效的将数据发送到相关的接收者?也就是说将接收者subscribe 不同的数据,如何做有效的filter。

6)如何做到可扩展,甚至将这个通信模块发到cluster上?

7)如何保证接收者接收到了完整,正确的数据?

AMQP协议解决了以上的问题,而RabbitMQ实现了AMQP。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();