聊聊RabbitMQ那些事

社区PHP
1.简介

今天给大家介绍一个消息中间件——rabbitMQ。

picture.image

2.消息队列

picture.image

想了解rabbitMQ,需要先了解什么是消息队列和AMQP。AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

问题:为什么没有通用的软件总线–一种通信系统,可以将信息从一个应用程序传递到另一个应用程序呢?

解决方案:1983,有个在美国的印度哥们Vivek Ranadive就设想了一种通用软件总线,采用发布订阅的模式,像主板上的总线一样供其他相应程序接入。他创办了一家公司Teknekron,实现了世界上第一个消息中间件The Information Bus(TIB)。随后IBM推出了MQSeries,微软推出了MSMQ(Microsoft Message Queue)

问题:各大商业具体消息中间件不通用且昂贵,没法解决大部分企业和开发者的问题。。如果应用已经订阅了TIBCO MQ消息,若突然需要消费来自IBM MQ的消息,则实现起来会非常困难。这些产品使用不同的API、不同的协议,因而毫无疑问无法联合起来组成单一的总线。

解决方案:为了打破这个壁垒,同时为了能够让消息在各个消息队列平台间互融互通, JMS (Java Message Service) 应运而生 。JMS 试图通过提供公共 Java API 的方式,隐藏单独 MQ 产品供应 商提供的实际接口,从而跨越了壁垒,以及解决了互通问题。是在开发者和MQ产品中间添加了一个中间层,它用来充当消息代理供应商专有API的包装器,就像JDBC为数据库API提供类似功能一样。2003年,ActiveMQ诞生, 就是 JMS 的 一种实现 。

问题:JMS是专门为Java编写的。在java体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差;

解决方案:2004,出现了AMQP规范。AMQP从一开始就设计为开放标准,以解决众多的消息队列需求和拓扑结构问题。凭借开发,任何人都可以执行这一标准,针对标准编码的任何人都可以和任意AMQP供应商提供的MQ服务器进行交互。2007,RabbitMQ诞生。

后面消息队列又又kafka、rocketMQ、pulsar,不再叙述,今天我们的主机是RabittMQ。

3.AMQP

在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。

AMQP协议是建立在TCP连接之上的,对于操作系统而言,建立和销毁TCP会话是昂贵的开销,所以AMQP协议定义了信道。

信道:是建立在“真实的”TCP连接内的虚拟连接。每条信道都会被指派一个唯一ID,在信道上面,我们可以完成消息发布、订阅等等动作。每条信道都是线程私密性的。

把TCP比如成电缆,AMQP就是电缆中的光纤束,支持让你多线程连接消息代理且共用一个TCP连接。

这使得实现了AMQP的provider天然性就是跨平台的。意味着我们可以使用Java的AMQP provider,同时使用一个python的producer加一个rubby的consumer。从这一点看,AQMP可以用http来进行类比,不关心实现的语言,只要大家都按照相应的数据格式去发送报文请求,不同语言的client均可以和不同语言的server链接。

AMQP的实现:

RabbitMQ

Apache Qpid

OpenAMQ

picture.image

AMQP核心概念

picture.image

4.RabbitMQ

Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。之所以叫Rabbit这个名字,是因为他们觉得,兔子是行动非常迅速的动物,而且繁殖起来也非常疯狂,把它用于分布式软件的命名再合适不过了。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

RabbitMQ入门需要了解的一个概念是交换机类型,常用的交换器类型有direct、topic、fanout、headers四种:

Direct Exchange:见文知意,直连交换机意思是此交换机需要绑定一个队列,要求该消息与一个特定的路由键完全匹配。简单点说就是一对一的,点对点的发送。

Fanout Exchange:这种类型的交换机需要将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。简单点说就是发布订阅。

Topic Exchange:直接翻译的话叫做主题交换机,如果从用法上面翻译可能叫通配符交换机会更加贴切。这种交换机是使用通配符去匹配,路由到对应的队列。通配符有两种:"*" 、 "#"。需要注意的是通配符前面必须要加上"."符号。

Headers Exchange:这种交换机用的相对没这么多。它跟上面三种有点区别,它的路由不是用routingKey进行路由匹配,而是在匹配请求头中所带的键值进行路由。创建队列需要设置绑定的头部信息,有两种模式:全部匹配和部分匹配。如上图所示,交换机会根据生产者发送过来的头部信息携带的键值去匹配队列绑定的键值,路由到对应的队列。

关于RabbitMQ,这篇就先介绍到这里,对于消息队列,朋友们有什么问题或者想看什么,可以在评论区给我留言。

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论