Kafka基础教程(一):认识Kafka
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,吞吐速率非常快,可以作为Hadoop的日志收集。Kafka是一个完全的分布式系统,这一点依赖于Zookeeper的分布式实现。
本文为新手准备,从Kafka的一些术语概念方面去认识Kafka。
Broker
Kafka是基于Zookeeper实现的一个分布式系统,它的每一个分布式节点称为Broker。一般的,我们搭建的kafka节点数不会少于3台,具体需要多少依据业务量而定。
Topic
Topic是主题的意思,Kafka规定每个消息都应该有个主题,Topic可以理解为对消息的一个分类,比如用户注册使用一个Topic,用户下单应该使用另外一个Topic。
Broker和Topic没有包含的含义,一个Broker下面可以存在多个Topic的消息,而一个Topic的消息可以保存在一个或者多个Broker中。
Partition
Partition是分区,其实这就是Kafka的队列,Partition中的数据是具有顺序的,数据按照顺序进行消费,但是不同Partition中数据丢失了顺序性。
创建Topic时,可以指定Partition数,一个Topic至少有一个Partition,kafka在接收到生产者发送的消息之后,会根据会根据Paritition机制将消息并行的存储到不同的Partition中,这样就提高了吞吐量。
如果我们需要严格控制消息的顺序,那么可以创建只包含一个Partition的Topic,或者在发布消息和消费消息时,指定发布或者消费的Partition。
Replication
Replication是Topic的副本,一个Topic可以有多个副本,一个Topic下有多个Partition,每个Partition在每个副本中有对应的Partition副本,因为Topic副本之间需要保持数据的一致性,因此这些Partition之间也就形成和Zookeeper一样的Leader-Follower集群结构,与Zookeeper不同的是,对于数据的读写操作都在Leader中,Follower副本只是当Leader副本挂了后才重新选取Leader,Follower并不向外提供服务。
为了保证高可用(HA),Kafka会将Partition和它的副本均匀的保存在集群的Broker中,因此一般设置副本数不超过集群Broker节点数,最好是副本数等于集群节点数,使得集群中每个Broker都保存有Partition,这也是Kafka默认的做法。
Producer
Producer即生产者,生产者将消息发布到Topic中,Kafka根据自己的机制将消息发布到对应的Partition中。生产者也可以指定消息存发布的Partition。
Consumer
Consumer即消费者,消费者从Topic或者Topic指定的Partition中获取消息进行消费。
Consumer Group
每个Consumer可以指定一个Group Name,相同Group Name的Consumer视为一个Group。在开发过程中,同一Group Name的Consumer应该实现相同功能!如果Consumer不指定Group Name,那么它属于默认的那个Group。
Consumer以Group的形式从Topic中获取消息进行消费,准确说是从某个Partition中获取消息进行消费。一个Group下会有一个或者多个Consumer,而Partition中的每个消息只会被同一Group(中的某一个Consumer)消费一次,因此如果想要多个Consumer都可以对同一个消息进行消费,需要设置它们的GroupName不一样就可以了。
Offset
Offset即偏移,偏移是Partition对Consumer Group而言的,当某个Consumer成功消费消息之后,Kafka会标记该Consumer对应的Group对于此Partition的Offset加1,也就是偏移一个单位,因此该Group下的其他Consumer就消费不到这个消息了。
ISR(in-sync replicas)
上面有提到,Partition可能会有多个Partition副本,然后这些Partition之间也就形成和Zookeeper一样的Leader-Follower集群结构,只不过Leader负责读写,Follower只是同步数据备用。既然是集群,那就涉及数据同步问题。
每个Partition的Leader会记录和维护一个与它保持数据同步的Replication集合(Follower),这个集合称为ISR,每个Partition都会有一个与它对应的ISR。当Leader接收到消息后,会等待Follower同步数据,当ISR中的所有Replication都确认已同步数据完成后,Leader就会认为消息已提交。
当Leader挂掉了,Replication集合对应的Follower就会重新选举生成新的Leader,因为新Leader与原Leader保持数据同步,因此这样就避免了数据丢失。如果Replication集合为空,Leader挂了就等于数据丢失了,因此Replication是很有必要的。
ISR由Leader维护,而判断一个Replication是否有效,主要看它是否通过Zookeeper连接并能及时的从Leader中同步数据(超时时间由server.properties中replica.lag.time.max.ms配置),而且还要同步的数据不能与Leader相差太多(消息个数由server.properties中replica.lag.max.messages配置)。
ACK
Kafka的ACK机制,指的是Producer的消息发送确认机制,这直接影响到Kafka集群的吞吐量和消息可靠性。这个可靠性级别由request.required.acks来申明,它有3个可选值:0,1,-1
0:当Producer将消息发布到Leader之后,无需等待Leader确认,可以继续发送下一条消息,这样就提高了发送效率,但是消息可靠性最低。
1:当Producer将消息发布到Leader之后,只需等待Leader确认,而不管ISR中是否已经完成数据同步,这也是Kafka默认的Ack机制。但是不保证消息一定发送成功,比如Leader收到消息并确认后还未进行同步数据就挂了。
-1:当Producer将消息发布到Leader之后,需要等到ISR中所有的Replication全部完成数据同步确认才算消息发送成功,这样做消息可靠性最高。
当Ack=-1时,往往需要结合min.insync.replicas(默认值为1)一起使用,这是因为ISR中的Replication由Leader维护,个数可能会减少到0,这是ISR是一个空集合,此时Ack=-1和Ack=1是同一种情况,而min.insync.replicas表示ISR中的Replication副本个数,当ISR中的Replication个数少于此配置时,就表示消息发布失败。
Key
Key是Kafka消息的路由,Producer在发布消息时可以指定一个路由Key,当Kafka收到消息时,会按照一定的规则选择消息的Partition:
1、如果发布时制定了Partition,则直接使用
2、如果未指定Partition,但是指定了Key值,那么根据Key值通过一些规则算法计算消息发布的Partition
总结
Kafka是基于发布-订阅模式的分布式消息服务系统,将上面的概率连接起来就是:
发布
当我们的应用连接到Kafka集群的一个或者多个Broker节点往某个Topic(或者某个Topic的Partition)发布消息时,Kafka收到消息后会根据它的路由Key等信息得到Partition,然后将消息转发到该Partition的Leader,然后Leader会根据ISR机制记录消息,根据Ack机制对Producer做出响应。
消费
当我们的应用连接到Kafka集群的一个或者多个Broker节点从多个Topic(或者Topic的Partition)中订阅消息时,可以指定当前消费者所属的群组(Group Name),多个群组(Group)可以订阅同一个Topic,每个群组都会受到消息,但是一个消息只会被同一Group中的某个Consumer消费掉,当消息被成功消费掉之后,Kafka就会标记与当前Consumer对应的Group和消息所属的Partition对应的Offset加1。
Kafka基础教程(一):认识Kafka的更多相关文章
- Kafka基础教程(四):.net core集成使用Kafka消息队列
.net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能. 因为代码 ...
- kafka实战教程(python操作kafka),kafka配置文件详解
kafka实战教程(python操作kafka),kafka配置文件详解 应用往Kafka写数据的原因有很多:用户行为分析.日志存储.异步通信等.多样化的使用场景带来了多样化的需求:消息是否能丢失?是 ...
- Kafka基础教程(二):Kafka安装
因为kafka是基于Zookeeper的,而Zookeeper一般都是一个分布式的集群,尽管kafka有自带Zookeeper,但是一般不使用自带的,都是使用外部安装的,所以首先我们需要安装Zooke ...
- Kafka基础教程(三):C#使用Kafka消息队列
接上篇Kafka的安装,我安装的Kafka集群地址:192.168.209.133:9092,192.168.209.134:9092,192.168.209.135:9092,所以这里直接使用这个集 ...
- kafka基础介绍
kafka基础介绍 一.kafka介绍 1.1主要功能 根据官网的介绍,kafka是一个分布式流媒体的平台,它主要有三大功能: 1.11:It lets you publish and subscri ...
- Kafka工具教程 - Apache Kafka中的2个重要工具
1.目标 - 卡夫卡工具 在我们上一期的Kafka教程中,我们讨论了Kafka Workflow.今天,我们将讨论Kafka Tool.首先,我们将看到卡夫卡的意义.此外,我们将了解两个Kafka工具 ...
- 1.kafka基础架构
kafka基础架构 ## 什么是kafka? Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域. 1.什么是消息队列? 2.使用消息队列的好处 1)解耦 允许你独立的 ...
- 《Kafka笔记》1、Kafka初识
目录 一.初识Kafka 1 apache kafka简介 2 消息中间件kafka的使用场景 2.1 订阅与发布队列 2.2 流处理 3 kafka对数据的管理形式 4 kafka基础架构 5 Ka ...
- 【入门教程】kafka环境搭建以及基础教程
问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有 ...
随机推荐
- URL+http协议
- Oracle 创建 md5 加密函数
使用 Oracle 的 utl_raw.DBMS_OBFUSCATION_TOOLKIT 可以获取 md5 加密字符串: select utl_raw.cast_to_raw(DBMS_OBFUSCA ...
- Mysql的表级锁
我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的.可根据不同的场景选用不同的锁定机制. ...
- 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入
参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...
- 登录界面.jsp
<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...
- DT10功能介绍--DT10多波示波器
功能介绍 有些嵌入式软件方面的问题,利用传统的调试器可能无法解决,而通过逻辑分析器则能有效地解决.请仔细阅读本文, 看我们如何一步一步地讲解在这种情况下所需的配置. 但是,从传统意义上讲,逻辑分析器是 ...
- [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn
[V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...
- springboot学习(一)
最近想学习springboot所以在网上找了很多文章参考怎么构建springboot项目以及集成mybatis 集成mybatis的部分参考了这两篇文章 https://blog.csdn.net/t ...
- Eclipse切换不同版本的jdk
var会在java1.8中报错,安装10版本以上的jdk可以解决问题,但是安装后Eclipse无法正常工作,后来发现是Eclipse没有切换版本,在网上找了好多教程都是切换系统变量,后来我发现可以直接 ...
- PC点击链接打开QQ聊天窗口
<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=QQ号码&site=qq& ...