流程图:

Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。
topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,且每条数据都有自己的offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

kafka存储机制

由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片和索引机制,将每个partition分为多个segment。每个segment对应两个文件——“.index”文件和“.log”文件。这些文件位于一个文件夹下,该文件夹的命名规则为:topic名称+分区序号。例如,first这个topic有三个分区,则其对应的文件夹为first-0,first-1,first-2。

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

分区的好处:

1,方便集群的伸缩
每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了

2,可以提高并发
可以以Partition为单位读写,提高集群的读写速度

分区是如何分配到broker上

  1. 保证所有的分区以及副本可以均衡在分布上所有的broker上
  2. 保证同一个分区及其副本尽量不要分布在同一个broker上

    副本(replication)好处:
    提高kafka的系统的可靠性和稳定性,同一个partitation对应一个或者多个副本,创建topic时就可以设置(–replication-factor 2)。没有副本,一旦当前保存消息的服务器宕机,就会造成消息丢失,如果有replication,当保存消 息的服务器宕机后,从新选举新的leader,继续进行消息读写,不会造成消息丢失。

zk保存kafka数据的目录结构



生产者如何写入消息的


为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。

消息写入时,放入分区的规则:

1),指定分区,直接按照指定分区写入
2,没有指定分区,但是消息中含有key(一般消息是key value的方式),通过key的值进行hash运算,计算得到一个partition,写入到这个分区。(aaa hash运算后可能得到一个和aaa没有任何关系的一个数值123132,对分区的总数量取模,根据结果,得到分区)
3, 如果没有指定分区,key都没有,使用轮询(第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法),找出一个分区,并写入。

ack应答机制:

0 producer不等待broker同步完成的确认,继续发送下一条(批)信息提供了最低的延迟。但是最弱的持久性,当服务器发生故障时,就很可能发生数据丢失。例如leader已经死亡,producer不知情,还会继续发送消息broker接收不到数据就会数据丢失
1 producer要等待leader成功收到数据并得到确认,才发送下一条message。此选项提供了较好的持久性较低的延迟性。Partition的Leader死亡,follwer尚未复制,数据就会丢失
-1/all 意味着producer得到header和所有follwer确认,才发送下一条数据

ISR(In Sync Replicas):
当ack配置-1时 leader收到数据,所有follower都开始同步数据,但有一个follower,因为某种故障,迟迟不能与leader进行同步,那leader就要一直等下去,直到它完成同步,才能发送ack。这个问题怎么解决呢?
Leader维护了一个动态的in-sync replica set (ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给follower发送ack。如果follower长时间未向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.log.time.max.ms参数设定。Leader发生故障之后,就会从ISR中选举新的leader。

消费者消费要点:消息的消费模式有两种:推送模式(push) 和拉取模式(pull)
kafka采取的拉取模式(pull),由消费者自己记录消费状态(消费者自己记录自己的消费位置(offset偏移量)),每个消费者相互独立的消费每个一个分区的消息。每个消费者消费完了后,对消息本身不做任何处理,决定该消息是否能被删除,跟消费者没有任何关系,与配置的消息过期时间和消息总容量的大小配置参数有关(log.retention.hours=168 log.retention.bytes=1G)。
消费者是以消费者组( consumer group)的方式,由一个或者多个消费者组成一个组,共 同消费一个topic(主题),在同一时刻,只能由同一个组的一个消费者去消费同一个分区。 pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直返回空数据。针对这一点,Kafka的消费者在消费数据时会传入一个时长参数timeout,如果当前没有数据可供消费,consumer会等待一段时间之后再返回,这段时长即为timeout。

kafka的工作流程相关推荐

  1. Kafka Broker 工作流程

    Zookeeper存储的Kafka的信息 查看zookeeper中的kafka节点所存储的信息 启动Zookeeper客户端 [atguigu@hadoop104 zookeeper-3.5.7]$ ...

  2. kafka的基本概念和工作流程分析

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!".买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是 ...

  3. 仅需3分钟,你就能明白Kafka的工作原理

    周末无聊刷着手机,某宝网 App 突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!". 买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是选了两个最新款 ...

  4. 再过半个小时,你就能明白kafka的工作原理了(2)(*)

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!".买一送一,还有这种好事,那我可不能错过!忍不住立马点了过去. ...

  5. 再过半小时,你就能明白kafka的工作原理了

    为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息"为了回馈老客户,女朋友买一送一,活动仅限今天!".买一送一还有这种好事,那我可不能错过!忍不住立马点了去.于是 ...

  6. kafka学习(二)kafka工作流程分析

    本文借鉴:再过半小时,你就能明白kafka的工作原理了(特此感谢!) 一.发送数据 PS:Producer在写入数据的时候永远的找leader,不会直接将数据写入follower 1.follower ...

  7. kafka工作流程及文件存储机制

    1.kafka工作流程 如图topicA有3个分区,每个分区有两个副本(包含一个leader,一个follower),发送消息可以一个一个的发送,也可以批量发送,0,1,2这种是offset偏移量,每 ...

  8. Kafka(消息队列原理,kafka定义,Kafka架构原理,kafka架构的工作流程)秒懂的kafka

    目录 什么是Kafka? 消息队列原理: 为什么要用Kafka? kafka的架构 kafka工作流程详解: 什么是Kafka? kafka是一个分布式消息队列 这个定义意味深长,记住容易,理解不易. ...

  9. Kafka笔记(一)之kakfa工作流程

    一.kafka基本架构术语 Producer(生产者):kafka生产者向 kafka broker 发消息的客户端: Consumer(消费者):kafka消费者向 kafka broker 取消息 ...

最新文章

  1. 太火!这本AI图书微软强推,程序员靠它拿下50K!
  2. shell中trap捕捉到信号的处理
  3. php 鼠标点击图片放大,css3如何实现鼠标放上图片放大?(附代码)
  4. 2019年4月27日 修改功能
  5. SVM 学习心得
  6. Qt利用avilib实现录屏功能_如何找到电脑录屏功能?4种方法教你一键打开,不会用来学一学...
  7. spring-data学习上
  8. C# WinForm禁止改变大小 最大化最小化隐藏 最大化最小化隐藏
  9. 高频面试题—聊一下Euraka的注册原理
  10. 有哪些免费的可以下载png图片的网站啊?
  11. 文件服务器 配额,文件服务器配额邮件通知
  12. C语言编程练习:猜数游戏
  13. OSM(OpenStreetMap)使用简述
  14. 2021秋招学习笔记
  15. 【基于人脸特征的心率检测研究】非接触式光电容积图和红外人脸视频瞬时心率估计
  16. 高新企业申请补贴需要什么条件
  17. java-swing-下拉列表
  18. Windows下Solr的安装与配置,附DIH全量导入MySQL数据、IK分词器配置详解——不用集成Tomcat
  19. matlab实现图形几何变换如平移,matlab实现平面图形的几何变换
  20. ygo游戏王卡组_游戏王最多种类的卡组,竟然高达六种形态

热门文章

  1. 解决使用TeamViewer远程控制电脑时,控屏字体太小问题
  2. vue在哪个勾子中发ajax请求
  3. 全球数百万的交易者正在使用的MT4
  4. 【Python文本处理】基于运动路线记录GPX的文件解析,及对经纬度坐标的数学模型运动速度求解
  5. RFC 是什么含义?
  6. 线性表的基本操作及应用(单链表的创建、插入、删除、查找、显示)
  7. 过于自信,结果被面试官吊打了。。。
  8. Cmake 坑爹让我在Ubuntu14.04 安装opencv的python接口库搞了一整天
  9. Myeclipse破解失败error: unable to access jarfile cracker.jar解决方法
  10. PPT:如何设置ppt中超链接的访问和未访问的颜色?