Kafka 对比 ActiveMQ
Kafka 将消息流按Topic 组织,保存消息的服务器称为Broker,消费者可以订阅一个或者多个Topic。为了均衡负载,一个Topic 的消息又可以划分到多个分区(Partition),分区越多,Kafka并行能力和吞吐量越高。
Kafka 集群需要zookeeper 支持来实现集群,最新的kafka 发行包中已经包含了zookeeper,部署的时候可以在一台服务器上同时启动一个zookeeper Server 和 一个Kafka Server,也可以使用已有的其他zookeeper集群。
和传统的MQ不同,消费者需要自己保留一个offset,从kafka 获取消息时,只拉去当前offset 以后的消息。Kafka 的scala/java 版的client 已经实现了这部分的逻辑,将offset 保存到zookeeper 上。每个消费者可以选择一个id,同样id 的消费者对于同一条消息只会收到一次。一个Topic 的消费者如果都使用相同的id,就是传统的 Queue;如果每个消费者都使用不同的id, 就是传统的pub-sub.
Kafka 的优点
Kafka 的不利
重复消息。Kafka 只保证每个消息至少会送达一次,虽然几率很小,但一条消息有可能会被送达多次。
消息乱序。虽然一个Partition 内部的消息是保证有序的,但是如果一个Topic 有多个Partition,Partition 之间的消息送达不保证有序。
复杂性。Kafka需要zookeeper 集群的支持,Topic通常需要人工来创建,部署和维护较一般消息队列成本更高
=-=======================================================================
00
今天让我们来谈谈身份高贵,举止优雅的消息中间件,主要还是浅谈,消息中间件这块水太深。大体上我们结合互联网业务做一些探讨,从互联网主要关心的消息安全性,服务器的稳定性容错性以及吞吐量三方面来讲。
由于这块产品非常多,我只挑选两个我使用过的产品结合使用经验做一些研究,他们是ActiveMQ和Kafka,前者完全实现了JMS的规范,后者看上去有一些“野路子”,并没有纠结于JMS规范,剑走偏锋的设计了另一套吞吐非常高的分布式发布-订阅消息系统,目前非常流行。接下来我们结合三个点(消息安全性,服务器的稳定性容错性以及吞吐量)来分别谈谈这两个消息中间件。今天我们谈Kafka,ActiveMQ的文章在此。
01 性能怪兽Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。”Apache Kafka is publish-subscribe messaging rethought as a distributed commit log.”,官网首页的一句话高度概括其职责。Kafka并没有遵守JMS规范,他只用文件系统来管理消息的生命周期。Kafka的设计目标是:
(1)以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
(2)高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
(3)支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
(4)同时支持离线数据处理和实时数据处理。
(5)Scale out:支持在线水平扩展。
所以,不像AMQ,Kafka从设计开始极为高可用为目的,天然HA。broker支持集群,消息亦支持负载均衡,还有副本机制。同样,Kafka也是使用Zookeeper管理集群节点信息,包括consumer的消费信息也是保存在zk中,下面我们分话题来谈:
1)消息的安全性
Kafka集群中的Leader负责某一topic的某一partition的消息的读写,理论上consumer和producer只与该Leader节点打交道,一个集群里的某一broker即是Leader的同时也可以担当某一partition的follower,即Replica。Kafka分配Replica的算法如下:
(1)将所有Broker(假设共n个Broker)和待分配的Partition排序
(2)将第i个Partition分配到第(i mod n)个Broker上
(3)将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上
同时,Kafka与Replica既非同步也不是严格意义上的异步。一个典型的Kafka发送-消费消息的过程如下:首先首先Producer消息发送给某Topic的某Partition的Leader,Leader先是将消息写入本地Log,同时follower(如果落后过多将会被踢出出Replica列表)从Leader上pull消息,并且在未写入log的同时即向Leader发送ACK的反馈,所以对于某一条已经算作commit的消息来讲,在某一时刻,其存在于Leader的log中,以及Replica的内存中。这可以算作一个危险的情况(听起来吓人),因为如果此时集群挂了这条消息就算丢失了,但结合producer的属性(request.required.acks=2 当所有follower都收到消息后返回ack)可以保证在绝大多数情况下消息的安全性。当消息算作commit的时候才会暴露给consumer,并保证at-least-once的投递原则。
2)服务的稳定容错性
前面提到过,Kafka天然支持HA,整个leader/follower机制通过zookeeper调度,它在所有broker中选出一个controller,所有Partition的Leader选举都由controller决定,同时controller也负责增删Topic以及Replica的重新分配。如果Leader挂了,集群将在ISR(in-sync replicas)中选出新的Leader,选举基本原则是:新的Leader必须拥有原来的Leader commit过的所有消息。假如所有的follower都挂了,Kafka会选择第一个“活”过来的Replica(不一定是ISR中的)作为Leader,因为如果此时等待ISR中的Replica是有风险的,假如所有的ISR都无法“活”,那此partition将会变成不可用。
3) 吞吐量
Leader节点负责某一topic(可以分成多个partition)的某一partition的消息的读写,任何发布到此partition的消息都会被直接追加到log文件的尾部,因为每条消息都被append到该partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证),同时通过合理的partition,消息可以均匀的分布在不同的partition里面。Kafka基于时间或者partition的大小来删除消息,同时broker是无状态的,consumer的消费状态(offset)是由consumer自己控制的(每一个consumer实例只会消费某一个或多个特定partition的数据,而某个partition的数据只会被某一个特定的consumer实例所消费),也不需要broker通过锁机制去控制消息的消费,所以吞吐量惊人,这也是Kafka吸引人的地方。
最后说下由于zookeeper引起的脑裂(Split Brain)问题:每个consumer分别单独通过Zookeeper判断哪些partition down了,那么不同consumer从Zookeeper“看”到的view就可能不一样,这就会造成错误的reblance尝试。而且有可能所有的consumer都认为rebalance已经完成了,但实际上可能并非如此。
Kafka 对比 ActiveMQ相关推荐
- Redis,kafka,activeMQ,RabbitMQ,JVM, lMax Disrupt等实现的队列进行对比--开篇
前言 结合前面提到的各种rabbitMQ的使用,本节开始综合的对比市场上流行的redis,kafka,activeMQ等的进行对比,附加使用的代码Demo提供参考.文章大致的结构分为,rabbitMQ ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理
为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...
- 详解Kafka与ActiveMQ的区别与联系!
在大数据开发过程中我们经常会使用到消息队列类型的组件,比较常见的就是Kafka与ActiveMQ,但很多同学闹不懂两者的区别和联系,今天小千就来带大家分析一下. 一.背景分析 消息队列这个类型的组件一 ...
- Kafka与ActiveMQ的区别与联系详解
在大数据开发过程中我们经常会使用到消息队列类型的组件,比较常见的就是Kafka与ActiveMQ,但很多同学闹不懂两者的区别和联系,今天小千就来带大家分析一下. 一.背景分析 消息队列这个类型的组件一 ...
- 息中间件kafka与activeMQ、rabbitMQ、zeroMQ、rocketMQ的比较
几种MQ产品说明: ZeroMQ : 扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...
- 面试官:说说kafka、activemq、rabbitmq、rocketmq都有什么优缺点和使用场景
为什么使用消息队列?消息队列的优点和缺点?kafka.activemq.rabbitmq.rocketmq都有什么优缺点? 面试官角度分析: (1)你知不知道你们系统里为什么要用消息队列这个东西? ( ...
- ActiveMQ RabbitMQ KafKa对比
前言: ActiveMQ和 RabbitMq 以及Kafka在之前的项目中都有陆续使用过,当然对于三者没有进行过具体的对比,以下摘抄了一些网上关于这三者的对比情况,我自己看过之后感觉还 是可以的,比较 ...
- core net 消费kafka_消息中间件之:Kafka、ActiveMQ、RabbitMQ、RocketMQ
<一>kafka的工作原理介绍blog.csdn.net<二>zk搭载kafka分布式消息队列浅析blog.csdn.net 一.简介 消息队列已经逐渐成为企业IT系统内部 ...
最新文章
- MATLAB从入门到精通-以实例的形式带你玩转Matlab三角函数
- bzoj1951 组合数取模 中国剩余定理
- mysql使用过程中的几个细节注意点
- bio java 例子_JAVA BIO 服务器与客户端实现示例
- 【转】刨根究底字符编码之三——字符编码的由来
- 德州2021高考考试成绩查询,德州高考成绩查询系统2021
- 即将发布的 JDK 11 包含了什么?
- ASP.NET MVC传递Model到视图的多种方式之通用方式的使用
- iOS底层探索之多线程(五)—GCD不同队列源码分析
- 几个北大和南开学霸的公众号,值得学习
- Python中的输入输出(IO)
- Android 7.0(API 24)以上调用系统安装包问题
- 多易大数据学习实况记录
- GDB 调试 Nginx 磨刀不误砍柴工
- C语言课程设计大作业——学生管理系统(详细含报告和源码)
- pe版linux操作系统制作,制作Linux版PE系统
- 5V转3V的降压芯片和LDO
- Java 导出富文本到Word(包含图片)
- 微信公众平台开发培训
- 系统重构数据同步利器之Canal实战篇
热门文章
- 常用的函数式接口_Supplier接口
- SpringBoot高级-消息-RabbitMQ安装测试
- SpringCloud:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
- Rocketmq原理最佳实践
- php arcode svg,在react中使用svg的各种方法总结(附代码)
- 数字转换英语c语言程序,c语言 把英文数字 例如 one hundred and eleven 转换位数字 111;怎样编写程序,要求1~1000内的英文数字...
- 【报错笔记】数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:...
- 四种π型RC滤波电路
- Linux下区分物理CPU、逻辑CPU和CPU核数
- C# Directory.Exists() 文件存在但返回一直为false