平时经常会看到很多人写文章分析Kafka、RabbitMQ、RocketMQ等各种MQ之间的性能比较,功能比较,但是实际上从MQ消息队列的门派上来说,这些MQ其实是分属不同的门派的。
那么这不同的门派之间,到底有什么区别呢?
有Broker的暴力路由
这个流派最典型的就是Kafka了,Kafka实际上为了提升性能,简化了MQ功能模型,仅仅提供了一些最基础的MQ相关的功能,但是大幅度优化和提升了吞吐量。
首先,这个流派一定是有一个Broker角色的,也就是说,Kafka需要部署一套服务器集群,每台机器上都有一个Kafka Broker进程,这个进程就负责接收请求,存储数据,发送数据。
Kafka的生产消费模型做的相对是比较暴力简单的,就是简单的数据流模型。
简单来说,他有一个概念,叫做“Topic”,你可以往这个“Topic”里写数据,然后让别人从这里来消费。
这个Topic可以划分为多个Partition,每个Partition放一台机器上,存储一部分数据。
在写消息到Topic的时候,会自动把你这个消息给分发到某一个Partition上去。
然后消费消息的时候,有一个Consumer Group的概念,你部署在多台机器上的Consumer可以组成一个Group,一个Partition只能给一个Consumer消费,一个Cosumer可以消费多个Partition,这是最最核心的一点。
通过这个模型,保证一个Topic里的每条消息,只会交给Consumer Group里的一个Consumer来消费,形成了一个Queue(队列)的效果。
假如你想要有一个Queue的效果,也就是希望不停的往Queue里写数据,然后多个消费者消费,每条消息就只能给一个消费者,那么通过Kafka来实现,其实就是生产者写多个Partition,每个Partition只能给Consumer Group中的一个Consumer来消费。如下图所示:
如果要实现Publish/Subscribe的模型呢?就是说生产者发送的每条消息,都要让所有消费都消费到,怎么实现?
那就让每个消费者都是一个独立的消费组,这样每条消息都会发送给所有的消费组,每个消费组里那唯一的一个消费者一定会消费到所有的消息。
但是除此之外,Kafka就没有任何其他的消费功能了,就是如此简单,所以属于一种比较暴力直接的流派。
它就是简单的消费模型,实现最基础的Queue和Pub/Sub两种消费模型,但是内核中大幅度优化和提升了性能以及吞吐量。
所以Kafka天生适合的场景,就是大数据领域的实时数据计算的场景。
因为在大数据的场景下,通常是弱业务的场景,没有太多复杂的业务系统交互,而主要是大量的数据流入Kafka,然后进行实时计算。
所以就是需要简单的消费模型,但是必须在内核中对吞吐量和性能进行大幅度的优化。
因此Kafka技术通常是在大数据的实时数据计算领域中使用的,比如说每秒处理几十万条消息,甚至每秒处理上百万条消息。
有Broker的复杂路由
第二个流派,就是RabbitMQ为代表的流派,他强调的不是说如何提升性能和吞吐量,关注的是说要提供非常强大、复杂而且完善的消息路由功能。
所以对于RabbitMQ而言,他就不是那么简单的Topic-Partition的消费模型了。