消息队列、AMQP和RabbitMQ
一、应用场景及优点
在项目设计、开发过程中,当我们遇到以下几种情况都可以使用消息队列:
- 对于一些无需即时返回且耗时的操作;
- 并发要求很高,数据处理很耗时,但是又无需及时返回信息的操作;
- 数据转移类的操作,比如客户端和内网都要进行数据传输和交换, 现有架构中, 客户端不能直接访问内网, 那么客户端只能: 先把数据保存到外网服务器, 然后内网服务器再拉回来处理. 这种方式可以保证数据都能被处理, 但实效性不够.通常, 外网服务器只起到一个暂时保存数据的作用, 保存客户端报上来的数据, 然后等待内网来拉走,把客户端看做producer, 内网看做consumer, 这正是消息队列的用武之地。
以上几个应用场景仅仅是我的一家之言,可以根据具体业务需求,灵活运用,消息队列更多的是一种解决问题的思路,见仁见智!
消息队列通过消息的生产/订阅,把消息写入消息队列,通过消费者订阅提取出来,对数据进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
另外消息队列还有两个优点,平台无关性,分布式部署;这个也是我个人比较看重的地方.
二、目前消息队列的主流产品
MSMQ:
这是微软的产品里唯一被认为有价值的东西。对我的客户来说,如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像MassTransit 或 NServiceBus这样的软件的连接,它完全可以解决这些问题。
ActiveMQ:
Java世界的中坚力量。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了MSMQ才有可能被考虑。
RabbitMQ:
我听说了很多关于这个用Erlang写成的消息中间件的优秀的特性。它支持开放的高级消息队列协议 (AMQP,Advanced Message Queuing Protocol),从根本上避免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要MassTransit 或 NServiceBus 的配合。它还具有“企业级”的适应性和稳定性。这些东西对客户来说十分的有吸引力。
我个人也比较偏好使用RabbitMQ,在商业环境中也有使用经验,能够承担商业级应用。
ZeroMQ:
我在研究AMQP时从发现了这个产品。开发这个产品的公司是AMQP集团的一部分,并且还有一个叫做OpenAMQ的产品。然而,他们却戏剧性的从AMQP分离的出去,并抱怨说这这个产品迷失了方向、变的越来越复杂。你可以到这里阅读Dear John的关于此事的文章。ZeroMQ具有一个独特的非中间件的模式,也就是说,跟其它几个接受测试的产品不同,你不需要安装和运行一个消息服务器,或中间件。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。
三、AMQP
高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS),AMQP客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用。
AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。
四、RabbitMQ
本文中的AMQP服务器是使用Erlang编写的RabbitMQ。它实现了AMQP规范0-8版的内容,并且将在近期实现0-9-1版的内容。
在开始之前再交代一些东西:异步消息是一个非常普通并且广泛使用的技术,从例如Skype或者XMPP/Jabber这样各种各样的即时消息协议到古老的email。
但是,这些服务都有如下特征:
- 它们会在传输消息的时候或多或少加入一些随意的内容(例如一封email可能会包含一个文本和关于办公室笑话的PPT)和一些比较正式的路由信息(例如email地址)。
- 它们都是异步的,也就是说它们将生产者和消费者区分开来,因此可能将消息加入队列(例如某人发给你一条消息,但是你不在线或者你的邮箱会收到一封email)。
- 生产者和消费者是具有不同知识的不同角色。我不需要知道你的IMAP用户名和密码就能够给你发送email。事实上,我甚至不需要知道你的email地址是否是一个马甲或者“真实”地址。这个特性意味着生产者不能控制什么内容被阅读或者订阅了 - 就像我的email客户端会舍弃掉大多数主动发送给我的医药广告。
AMQP是一个抽象的协议(也就是说它不负责处理具体的数据),这个事实并不会将事情变得更复杂。反而,Internet使得消息无处不在。人们通常使用它们和异步消息简单灵活地解决很多问题。而且构建AMQ中的异步消息架构模型最困难的地方在于上手的时候,一旦这些困难被克服,那么构建过程将变得简单。
安装:
需要说明的是,RabbitMQ支持目前主流的所有操作系统,这一点也是吸引我的地方。
- Erlang/OTP包,下载地址是 http://erlang.org/download.html,安装说明在 http://www.erlang.org/doc/installation_guide/part_frame.html 。
- RabbitMQ,下载地址是 http://www.rabbitmq.com/download.html,安装说明在 http://www.rabbitmq.com/install.html。
- Python,simplejson 下载地址: http://www.python.org/getit/,http://pypi.python.org/pypi/simplejson#downloads 。
详细的安装步骤可以参考:
- http://blog.csdn.net/historyasamirror/article/details/6827870
- http://www.rabbitmq.com/admin-guide.html
RabbitMQ的文档比较全面,网上资料比较丰富,学习成本相对已经比较低了。
现在你需要做的就是启动RabbitMQ服务器。
今天到此为止吧,改天再写关于RabbitMQ的运行机制,后续会出来具体的使用方法,以及我对RabbitMQ的简单实用封装。
参考资料:
AMQP和RabbitMQ入门 http://www.infoq.com/cn/articles/AMQP-RabbitMQ