消息队列简谈

现在软件开发越来越复杂,各部分耦合也越来越严重。尤其是一些创业公司,各部分模块变化频繁,给软件开发和设计提出了很多的要求。这时候,消息队列就越来越重要了。

一般来说,消息队列的使用场景有:

1、各部分解耦合

2、高峰时的削峰(作为cache)

3、可以作为RPC调用

4、热插拔,可以在不重启的情况下,改变网络拓扑形式和计算能力,对系统进行扩容

我主要看了ZeroMQ和RabbitMQ,可以对照着来学习。

主要的消息队列包括kafka、ZeroMQ和RabbitMQ等,其中ZeroMQ的速度最快,和其他几个的不是一个数量级,但是它也有不足的地方。严格来说,ZeroMQ并不是消息队列,而是一个网络开发的套件,所以它不包含消息的持久化、RPC、集群管理等企业开发所需要的重要特性。kafka主要是用于日志的收集。RabbitMQ是一般应用最广泛的消息队列。

消息队列是建立在socket基础上的,不能用socket那种一对一的形式来理解消息队列的连接。比如在ZeroMQ中,消息队列的socket能够同时连接多个终端。

消息队列的拓扑形式主要有:

一、request/reply

[img]http://dl2.iteye.com/upload/attachment/0129/8692/9de2bccd-f6f4-3b0e-943a-70f372d44c21.jpg[/img]

这种就是一般的一对一的连接

二、publisher/subscriber

[img]http://dl2.iteye.com/upload/attachment/0129/8694/59d08853-eabb-3544-a364-50f82549d36b.jpg[/img]

这种拓扑形式主要是消息的分发,一个服务器的消息,会分发给所有和他连接的订阅者。

三、producer/consumer(0MQ成为PUSH/PULL)

[img]http://dl2.iteye.com/upload/attachment/0129/8696/c18a99e7-c6a8-3549-9420-5da0b1cf9480.jpg[/img]

这种也是一对多的拓扑形式,但是和订阅者不同的是,一条消息只能发送给所有消费者中的一个,所有消费者是竞争获取消息的关系。这种拓扑形式主要是用于计算能力有限、扩容的情况。

当然不同的消息队列在使用中会有一些差异,比如0MQ使用filter对消息进行过滤,而RabbitMQ中channel的连接有direct、fanout和topic几种形式,等等,这些要在使用中进行体会。

你可能感兴趣的:(消息队列简谈)