消息队列与RabbitMQ
1 什么是消息队列
消息指进程或应用间通信的数据;队列是保存数据的结构;消息队列是指进程或应用间通信时,保存消息的容器。消息队列独特的机制和结构保证了消息发送者和接收者之间良好的异步通信。
2 为什么用消息队列
传统的进程间通信(也可为模块间通信)较为单一。消息生产者发送消息等待消息消费者接收消息,在此同步通信过程中会出现数据丢失、生产者长时间等待以及两者之间高耦合等问题。消息队列在保证消息生产者和消费者之间的正常通信的同时,也解决了传统消息通信的弊端。其优势表现如下:
(1)异步通信。消息队列提供了异步通信协议,消息保存在队列容器中,消息消费者不需要在同一时间与生产者交互。消息队列可以做消息缓存,等待消费者处理,因此可以降低对消费者的要求。
(2)路由机制。消息队列中应用路由机制,消息队列管理器将消息路由到指定消费者,并可以对多个接收相同类型消息的消费者load balance。消息队列的路由机制使得网络中不互通的消息生产者与消费者之间依然可以通信。
(3)数据保障。消息队列保障了消息数据的正确性,当消息接收者不可用时,消息队列会保存消息数据直到消息被正确传递。消息队列的接收验证机制进一步保证了消息数据的可靠性,当接收者接收消息并正常处理后会想消息队列管理器发送ack信号,确认消息已经接收。
(4)降低耦合。消息队列降低了消息生产者和消费者直接的耦合度,两者只需遵守约定的消息格式,无需关心对方,也并不知道对方是谁。
3 消息队列软件
MSMQ
这是微软的产品里唯一被认为有价值的东西。对我的客户来说,如果MSMQ能证明可以应对这种
任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像
MassTransit 或 NServiceBus这样的软件的连接,它完全可以解决这些问题。
ActiveMQ
Java世界的中坚力量。它有很长的历史,而且被广泛的使用。它还是跨平台的,给那些非微软平台的产品提供了一个天然的集成接入点。然而,它只有跑过了MSMQ才有可能被考虑。
ZeroMQ
我在研究AMQP时从发现了这个产品。开发这个产品的公司是AMQP集团的一部分,并且还有一个叫做OpenAMQ的产品。然而,他们却戏剧性的从AMQP分离的出去,并抱怨说这这个产品迷失了方向、变的越来越复杂。你可以到这里阅
读Dear
John的关于此事的文章。ZeroMQ具有一个独特的非中间件的模式,也就是说,跟其它几个接受测试的产品不同,你不需要安装和运行一个消息服务器,或
中间件。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。非常有趣的是,他们也同样使用这
方式在任何利用ZeroMQ进行强大的进程内通信的语言里创建Erlang风格的这种执行角色。
RabbitMQ
我
听说了很多关于这个用Erlang写成的消息中间件的优秀的特性。它支持开放的高级消息队列协议(AMQP,Advanced Message
Queuing
Protocol),从根本上避免了生产厂商的封闭,使用任何语言的各种客户都可以从中受益。这种协议提供了相当复杂的消息传输模式,所以基本上不需要
MassTransit 或 NServiceBus 的配合。它还具有“企业级”的适应性和稳定性。这些东西对我的客户来说十分的有吸引力。
4 RabbitMQ应用