消息中间件的定位分析
在以下的分析中,把产生消息的应用统一定义为消息的生产者,接收消息的应用统一定义为消息的消费者,尽管在mq中不使用这样的定义,而是称之为消息的发送 者和接收者。从不同的消息中间件对消息的产生者和使用者的名称定义来看,实际上已经反映出各消息中间件之间定位的差异,通过下面的分析,这种差异会更加清 晰。为了概念的统一,本文统一采用消息的生产者和消费者。
1、MQSeries
Mq设计的核心思想是存储转发,围绕消息如何发送到目的地完成产品的各类功能。在mq中,发送消息之前,需要把消息流转的路径配置出来,消息的生产者必须 知道消息在什么地方被消费,需要把消息发送到正确的目的地,并把消息放入正确的队列。消息的消费者从固定的本地队列中接收消息,只要是进入这个本地队列的 消息,消费者认为都是属于自己的消息。典型的使用模式如下:
从这个过程来看,mq实际上是消息的生产者驱动的,生产者决定把消息发送给哪个消费者,需要把消息放入正确的队列,无论这个队列有没有消费者。
从实际业务系统的角度来看,mq的使用是由业务规则驱动的,业务规则通过对消息的流转路径的配置体现出来(在这里的业务规则不包括对消息的实际处理规则)。
2、TongLINK/Q
TongLINK/Q的设计理念、定位和MQ类似,典型应用模式如下:
MQ和TongLINK/Q作为国内应用最广泛的消息中间件,主要解决企业内、外跨网络的可靠数据传输。基本的应用模式为点对点数据传输。
这类消息中间件主要解决了消息生产者和消费者之间的异步、可靠传输。
3、ActiveMQ
Active
MQ作为JMS的一个实现,基本的理念是提供一个消息在生产者和消费者之间交换的媒介,从Active
MQ的名称(broker)也能够看出,它的定位是为客户端应用提供消息交换的代理。这一点和MQSeries的定位完全不同,MQSeries更多的应用场景是解决点对点的消息传输。消息的“传输”和“交换”是两种完全不同的应用场景。
ActiveMQ的典型应用场景为:
生产者产生消息,并放入它所连接的代理服务器的队列中,本地消费者可以直接从这个队列中接收消息,在这种模式下,实现的是消息的本地消费,即消息的生产者和消费者连接到同一个代理服务器。
ActiveMQ还支持另外一种消息的消费模式——异地消费,通过在代理服务器之间配置传输通道,多个代理服务器可以组成一个服务器网络,消费者可以连接
到服务器中的任一代理服务器,异地消费其它代理服务器的消息。异地消费消息只需要满足几个简单的条件,包括生产者和消费者打开的队列名相同,消息流转次数
(流转中能够经过的代理服务器个数)在传输通道配置的范围内即可,使用非常方便。
从ActiveMQ的典型使用场景可以看到,消息的生产者只负责消息的生产,并不关心消息是否正确提交到消费者所在的服务器。这一点和MQSeries明
显不同。从消费者的角度来看,消费者只需要连接到代理服务器,消费属于自己的消息,在这个过程中,消费者不关心本地是否有能够消费的消息,代理服务器会自
动查找到属于这个消费者的消息,并把这些消息转移到消费者连接的代理服务器,而这个过程对于消费者来看,是完全透明的,消费者不关心消息的存放地点是本地
还是异地。
从异地消费的内部消息流转过程可以看出,ActiveMQ的核心思想实际上是由消费者驱动的,如果没有消费者,消息会一直保存在生产者连接的代理服务器的队列中;只有有消费者时,代理服务器组成的网络才会把消息流转到消费者连接的代理服务器的队列中。
使用ActiveMQ,更适合大量小消息在不同的应用之间进行快速交换的应用场景。对于跨网络的大消息传输,由于ActiveMQ是消费者驱动,只有消费
者连接到代理服务器时,消息才从源服务器向目标服务器转移,消费者需要等待整个消息的完整传输过程,这一过程根据实际的网络的不同,可能会比较“漫长”,
不能实现生产者和消费者之间完全的异步传输,在这样的场景下,MQSeries会更适合。
4、Rabbit MQ
Rabbit
MQ主要实现的也是生产者和消费者之间的数据交换,但是更强调消费者接收消息的规则。看一下Rabbit MQ的典型使用场景:
从产品的基本定位来看,Rabbit MQ和Active
MQ一样,都是消息在不同的客户端应用之间的交换,但是在具体的实现上,不同的产品有各自的出发点。
Rabbit
MQ的生产者并不把消息直接放入队列,而是首先经过一个exchange,通过在exchange配置规则,再确定把消息放入那个消费者的队列。
Rabbit
MQ的生产者只负责产生消息,生产者从不把消息直接放入队列,不关心消息是否能够放入队列,也就是不关心是否有符合条件的消费者,生产者只能把消息发送到exchange。如果没有任何消费者需要这个消息,消息不会进入任何队列。
从这个过程来看,Rabbit MQ实际上也是由消费者驱动。