同为消息中间件,Kafka与ActiveMQ的区别对比

2,578 阅读3分钟

我们知道,在大数据开发过程中我们经常会使用到消息队列类型的组件。消息队列中间件主要用来实现异步消息、应用解耦、流量削峰等功能。那么,业务中常见的就是Kafka与ActiveMQ。同为消息中间件,二者的区别究竟在哪里,今天我们就做一个简单的对比。。

一、Kafka和ActiveMQ基本对比

在这里插入图片描述 ActiveMQ被称为“传统”mq。所谓“传统”是指,他要支持一些标准接口,比如AMQP, STOMP等需要维护consumer的状态。即当前consumer读到哪个数据了,是ActiveMQ来维护的,因此当我们使用ActiveMQ时往往是读取不到。 在这里插入图片描述

Kakfa一开始被设计就是以高吞吐+高性能+HA来实现的,因此我们通过上表的对比也可以看到Kafka的吞吐量大概高于ActiveMQ两个数量级。Kafka的核心设计是append log file。即不断追加写log文件来实现消息数据的写入。因此使用这种磁盘追加写的性能要远高于ActiveMQ随机写。 通过下表我们能够有着更直观的感受。

对比ActiveMQKafka
开发语言javascala
接口协议遵守JMS规范,各种语言支持良好没有遵循标准MQ接口协议,使用相对复杂
吞吐量万级(磁盘随机读写)百万级(磁盘顺序读写)
游标位置ActiveMQ来管理,无法读取历史数据客户端自己管理,可重复读取
时效性ms级ms级
工作模型queue、topic只有topic,但是每个topic可以有很多partition分区

二、从消费模式看activemq与kafka

1、activemq activemq中使用传统的一对一、一对多(发布/订阅)的模式,也就是其中的queue与topic。 queue即多对一,producer往queue里发送消息,消费者从queue里取,消费一条,就从queue里移除一条。每条消息只会被消费一次。
topics就是广播。producer往broker发消息,每个消息会包含topic。消费者订阅感兴趣的topic,那么所有订阅了topic的消费者都会收到消息。 在这里插入图片描述

topics就是广播。producer往broker发消息,每个消息会包含topic。消费者订阅感兴趣的topic,那么所有订阅了topic的消费者都会收到消息。

在这里插入图片描述

2、kafka kafka是基于发布/订阅的消息系统。他的概念相对复杂一点。 在这里插入图片描述

上图中的kafka Brokers即一个kafka集群。 Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic。Producer在发送消息时可以通过指定分区Partition来发送到Topic的不同分区,也可以通过指定均衡策略来将消息发送到不同的分区中。当不指定分区时,就会采用默认的随机均衡策略,将消息随机的存储到不同的分区中。 在消费者消费消息时,kafka使用offset来记录当前消费的位置。消费过程中,可以有多个不同的group来同时消费同一个topic下的消息。对于一个group而言,消费者的数量不应该多于分区的数量,因为在一个group中,每个分区至多只能绑定到一个消费者上,即一个消费者可以消费多个分区,一个分区只能给一个消费者消费。因此,若一个group中的消费者数量大于分区数量的话,多余的消费者将不会收到任何消息。

三、应用场景总结

总体来讲Kafka特别适合的场景是实时数据分析,log分析等高吞吐、高性能的场景。 而activemq由java编写,所以可以作为一个jar包,放到java项目里,用代码启动和配置。当并发量在万级以下时,用activemq作为消息中间件可以达到更简洁的效果。