在介绍RabbitMQ之前,我们先了解一下消息队列的简史
RabbitMQ简史
1983年孟买26岁的工程师Vivek Ranadive设想一种软件总线,同年Teknekron诞生了。
1985年用于高盛,用于解决金融交易。于是发布订阅模式(PubSub)诞生了,同时还诞生了世界上第一个现代消息队列软件:Teknekron的The Information Bus(TIB)。
由于在那个时期金融交易行业门庭若市,因此TIB迅速传播开来。它引起了电信特别是新闻机构的注意。这些行业也特别需要将信息及时发布给千变万化的客户。这也解释了为什么在1994年大型新闻机构路透社收购了Teknekron。
与此同时,这个迅猛发展的企业软件也引起了蓝色巨人的注意。毕竟IBM最大的几位客户都来自于金融服务行业。因此,在20世纪80年代后期,IBM开始研究开发自己的消息队列软件,实际开发工作始于1990年,三年后,消息队列服务器软件IBM MQ产品系列面世。17年后,MQ系列进化成了WebSphere MQ并统治着商业消息队列平台市场。
在那段时间,TIB并没有消失在路透社腹中。相反,它仍然是企业通信市场的主要参与者。并且在1997年Teknekron以TIBCO的形式作为一家独立公司再度出现。同年,微软也在消息通信市场崭露头角:微软消息队列MSMQ诞生。
通过这一系列的革新,消息队列(MQ)软件主要留住了大型组织机构,它们需要可靠性、解耦以及实时消息通信。为什么MQ不去寻找更大的市场呢?
因为:供应商壁垒。因为,商业MQ供应商想要解决应用互通的问题,而不是去创建标准接口来允许不同的MQ产品互通。供应商壁垒维持着足够高的价格和利润率,并使得这些商业MQ软件对那些当今繁荣昌盛的初创公司和Web2.0公司来说遥不可及。
结果,中小技术公司并不是唯一一个对高价格MQ供应商感到不满的。那些造就MQ产业的金融服务公司对此也激动不起来。越是大型的金融公司越不可避免地使用来自众多供应商的MQ产品,来服务企业内部的不同应用。如果应用已经订阅了TIBCO MQ消息,若突然需要消费来自IBM MQ的消息,则实现起来会非常困难。这些产品使用不同的API、不同的协议,因而毫无疑问无法联合起来组成单一的总线。为了解决这个问题,Java Message Service(JMS)在2001年诞生了。
JMS试图通过提供公共Java API的方式,隐藏单独MQ产品供应商提供的实际接口,从而跨越了壁垒和解决了互通问题。从技术上讲,Java应用程序只需针对JMS API编程,选择合适的MQ驱动即可。JMS会打理好其他部分。
问题是你在尝试使用单独标准化接口来胶合众多不同的接口。这就像是把不同类型的衣服黏在一起:缝合处终究会裂开,真想会暴露出来。使用JMS的应用程序会变得更加脆弱。我们需要新的消息通信标准化方案。
2004年,救世主AMQP诞生了。AMQP从一开始就设计为开放标准,以解决众多的消息队列需求和拓扑结构问题。凭借开发,任何人都可以执行这一标准,针对标准编码的任何人都可以和任意AMQP供应商提供的MQ服务器进行交互。
在2006年,Rabbit Technologies诞生了:其拥有着RabbitMQ的知识产权。之所以叫Rabbit这个名字,是因为他们觉得,兔子是行动非常迅速的动物,而且繁殖起来也非常疯狂,把它用于分布式软件的命名再合适不过了。
时机总是如此的恰到好处,就在此时,AMQP规范的第一份公开草案也公之于世了。作为一份新的规范,AMQP正快速修订。这正是Erlang可以施展拳脚的地方。通过Erlang,RabbitMQ可以快速开发并跟上AMQP标准前进的节奏。核心开发人员Tony Garnock-Jones仅仅用了两个半月就将RabbitMQ 1.0版本开发完成了。2007年RabbitMQ 1.0版本正式面世。
此处简短介绍下ErLang,Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,因此非常适合于构建分布式,实时软并行计算系统。使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。
Erlang并非一门新语言,它出现于1987年,只是当时对并发、分布式需求还没有今天这么普遍,当时可谓英雄无用武之地。Erlang语言创始人Joe Armstrong当年在爱立信做电话网络方面的开发,他使用Smalltalk,可惜那个时候Smalltalk太慢,不能满足电话网络的高性能要求。但Joe实在喜欢Smalltalk,于是定购了一台Tektronix Smalltalk机器。但机器要两个月时间才到,Joe在等待中百无聊赖,就开始使用Prolog,结果等Tektronix到来的时候,他已经对Prolog更感兴趣,Joe当然不满足于精通Prolog,经过一段时间的试验,Joe给Prolog加上了并发处理和错误恢复,于是Erlang就诞生了。这也是为什么Erlang的语法和Prolog有不少相似之处。
我们再回头来看RabbitMQ。就这样一直到今天,RabbitMQ广泛使用在小到初创公司,大到互联网巨头。其中,令创始人感到惊讶的是:Rabbit的客户主要是技术公司而并非金融公司。同时,RabbitMQ也吸引着那些只有少量预算同时也要解决消息通信的个人或团队。
我们在了解了简史之后,接下来我们再来看下,如何搭建RabbitMQ环境
搭建RabbitMQ环境
下载地址:https://www.rabbitmq.com/download.html
Windows下安装
1.安装Erlang: 下载地址:https://www.erlang.org/downloads
安装:
安装完成。
2.安装RabbitMQ:
安装完成。
3.启动管理工具
- 打开RabbitMQ Server的安装目录下的
rabbitmq_server-3.7.16sbin
- 在此目录下,打开cmd,并输入命令,启用Web管理界面
rabbitmq-plugins enable rabbitmq_management
代码语言:javascript复制 此处提示Erlang没有添加环境变量,添加Erlang环境变量后重试。
- 启动RabbitMQ Server
- 访问
http://127.0.0.1:15672
Linux(Ubuntu)下安装
1.安装Erlang
代码语言:javascript复制sudo apt-get install erlang
2.安装RabbitMQ
代码语言:javascript复制sudo apt install rabbitmq-server
3.启动、停止
代码语言:javascript复制sudo service rabbitmq-server start
sudo service rabbitmq-server stop
sudo service rabbitmq-server restart
4.开启Web界面管理工具
代码语言:javascript复制rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
5.解决guest用户不允许访问
代码语言:javascript复制cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.7/ebin
sudo vim rabbit.app
# 将 {loopback_users, [<<”guest”>>]}
# 修改为 {loopback_users, []}
# 原因:rabbitmq从3.3.0开始,使用guest/guest权限只能通过localhost访问
6.重启服务,就可以访问Web界面啦
代码语言:javascript复制sudo systemctl restart rabbitmq-server.service
Web管理界面咱们会在理解了RabbitMQ消息通信中的基本概念后,再详细介绍。