activeMQ与kafka比较
前言
消息中间件的主要作用是:解耦、异步、削峰填谷
解耦:将接口调用依赖的两个服务解耦,方便分布式部署。
异步:服务器之间的不同接口调用会降低服务器执行性能,即每个接口都要等待返回,采用MQ可以异步完成接口调用
削峰填谷:MQ可以保存消息,在服务器处理消息压力大的时候存储消息,在服务器压力小的时候倾泻,可以提升服务器利用率。
简介
ActiveMQ简介
activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、 可扩展的、稳定的和安全的企业级消息通信
Kafka简介
Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
特性
ActiveMQ特性
(1)事务
AMQ支持事务,在connection对象创建session的过程中可以选择是否支持事务,在支持事务的session中,生产者发送消息的时候会transactionId。broker收到消息后判断是否有transactionId,如果有就把message保存在transaction store中,等待commit或者rollback消息。
(2)在传统项目中,如果消息的量级不大,选择AMQ更优,AMQ拥有更好的系统支持能力,且安装配置简单,安装和维护成本低。
kafka特性
(1)利用zk实现负载均衡和leader选举,且支持高并发
(2)零拷贝技术,减少数据拷贝,提升性能。
(3)可进行持久化操作。将消息持久化到磁盘。
(4)分布式系统,易于向外扩展,无需停机,就可以横向扩展。
(5)一个topic可以分为多个partition,每个partition是一个有序的队列,partition物理上由多个segment组成,每个Segment存着message信息。
(6)支持批量发送,可以配置收集一定数量的消息然后再进行发送
(7)支持顺序生产,顺序消费:kafka生产者发消息的时候可以指定一个key,那么这个key对应的消息会发到相同的partition中,又因为partition是一个有序的队列,所以只要单个consumer来消费这个partition中key对应的消息,就可以保证这批消息的顺序。
特殊情况
kafka消息可能出现乱序的情况
生产者在发送消息的时候,若是异步发送给broker的,那么这个broker可能存在多个未确认的消息在同时发送的,也就是说,可能有三条有顺序要求的消息(m1,m2,m3)在发送,然后会存在消息发送成功状态未知的情况,有可能存在m1发送失败,m2,m3发送成功,如果m1进行了重试,重新发送后成功了,这个时候消息顺序就乱了(m2,m3,m1)。如果对于数据有严格顺序要求的,发送的时候可以配置参数max.in.flight.requests.per.connection为1,表示在后一条消息发送之前,就已经知道前面消息是否发送成功的状态。这样就可以避免前一条发送失败的情况下,后一条消息继续发送,导致的顺序错乱。
两者区别
(1)kafka是appendLog形式记录消息的,而AMQ类似于传统数据库形式记录消息,显然kafka这种形式的消息记录模式效率更高(磁盘追加写的性能要远高于随机写)。
(2)kafka可配置参数较多,对于熟练使用它的人来说,可以更灵活的处置。AMQ使用简单,配置较少,开箱即用,但灵活性较低。
(3)AMQ是被动接收消息的,kafka是主动拉取式的
(4)前期使用的时候kafka不支持SSL,而AMQ支持,所以选择AMQ的企业如果不想做改动也就不会选择kafka。
(5)kafka支持批量发送,它会在本地收集到一批消息之后再发送,而AMQ的批量需要客户端自己实现
(6)kafka在消息发送的时候可以选择partition数目,而AMQ只能发送到一个broker,kafka的容错能力比AMQ强
(7)kafka部署成本较高,维护要求比AMQ高
(8)AMQ社区不活跃,kafka社区活跃
(9)AMQ支持jdk1.6版本,有些老项目需要维护的还需要依赖它
(10)另外,AMQ历史悠久,支持的工具比较多
(11)AMQ采用的是kahadb,Kafka采用的是levelDb