kafka工作原理介绍

两张图读懂kafka应用:

Kafka 中的术语

  • broker:中间的kafka cluster,存储消息,是由多个server组成的集群。
  • topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据。
  • producer:往broker中某个topic里面生产数据。
  • consumer:从broker中某个topic获取数据。

Kafka 中的术语设计:

1、Broker

中间的kafka cluster,存储消息,是由多个server组成的集群。

2、topic与消息

kafka将所有消息组织成多个topic的形式存储,而每个topic又可以拆分成多个partition,每个partition又由一个一个消息组成。每个消息都被标识了一个递增序列号代表其进来的先后顺序,并按顺序存储在partition中。

这样,消息就以一个个id的方式,组织起来。

  • producer选择一个topic,生产消息,消息会通过分配策略append到某个partition末尾。
  • consumer选择一个topic,通过id指定从哪个位置开始消费消息。消费完成之后保留id,下次可以从这个位置开始继续消费,也可以从其他任意位置开始消费。

上面的id在kafka中称为offset,这种组织和处理策略提供了如下好处:

  • 消费者可以根据需求,灵活指定offset消费。
  • 保证了消息不变性,为并发消费提供了线程安全的保证。每个consumer都保留自己的offset,互相之间不干扰,不存在线程安全问题。
  • 消息访问的并行高效性。每个topic中的消息被组织成多个partition,partition均匀分配到集群server中。生产、消费消息的时候,会被路由到指定partition,减少竞争,增加了程序的并行能力。
  • 增加消息系统的可伸缩性。每个topic中保留的消息可能非常庞大,通过partition将消息切分成多个子消息,并通过负责均衡策略将partition分配到不同server。这样当机器负载满的时候,通过扩容可以将消息重新均匀分配。
  • 保证消息可靠性。消息消费完成之后不会删除,可以通过重置offset重新消费,保证了消息不会丢失。
  • 灵活的持久化策略。可以通过指定时间段(如最近一天)来保存消息,节省broker存储空间。
  • 备份高可用性。消息以partition为单位分配到多个server,并以partition为单位进行备份。备份策略为:1个leader和N个followers,leader接受读写请求,followers被动复制leader。leader和followers会在集群中打散,保证partition高可用。

3、Partitions

每个Topics划分为一个或者多个Partition,并且Partition中的每条消息都被标记了一个sequential id ,也就是offset,并且存储的数据是可配置存储时间的

4、producer

producer生产消息需要如下参数:

  • topic:往哪个topic生产消息。
  • partition:往哪个partition生产消息。
  • key:根据该key将消息分区到不同partition。
  • message:消息。

5、consumer

传统消息系统有两种模式:

  • 队列
  • 发布订阅

kafka通过consumer group将两种模式统一处理:每个consumer将自己标记consumer group名称,之后系统会将consumer group按名称分组,将消息复制并分发给所有分组,每个分组只有一个consumer能消费这条消息。如下图:

于是推理出两个极端情况:

  • 当所有consumer的consumer group相同时,系统变成队列模式
  • 当每个consumer的consumer group都不相同时,系统变成发布订阅

注意:

1、Consumer Groups 提供了topics和partitions的隔离, 如上图Consumer Group A中的consumer-C2挂掉,consumer-C1会接收P1,P2,即一个consumer Group中有其他consumer挂掉后能够重新平衡。如下图:

2、consumer并发消费消息时,容易导致消息乱序,通过限制消费者为同步,可以保证消息有序,但是这大大降低了程序的并发性。

kafka通过partition的概念,保证了partition内消息有序性,缓解了上面的问题。partition内消息会复制分发给所有分组,每个分组只有一个consumer能消费这条消息。这个语义保证了某个分组消费某个分区的消息,是同步而非并发的。如果一个topic只有一个partition,那么这个topic并发消费有序,否则只是单个partition有序。

一般消息系统,consumer存在两种消费模型

  • push:优势在于消息实时性高。劣势在于没有考虑consumer消费能力和饱和情况,容易导致producer压垮consumer。
  • pull:优势在可以控制消费速度和消费数量,保证consumer不会出现饱和。劣势在于当没有数据,会出现空轮询,消耗cpu。

kafka采用pull,并采用可配置化参数保证当存在数据并且数据量达到一定量的时候,consumer端才进行pull操作,否则一直处于block状态。kakfa采用整数值consumer position来记录单个分区的消费状态,并且单个分区单个消息只能被consumer group内的一个consumer消费,维护简单开销小。消费完成,broker收到确认,position指向下次消费的offset。由于消息不会删除,在完成消费,position更新之后,consumer依然可以重置offset重新消费历史消息。

消息发送语义

producer视角

  • 消息最多发送一次:producer异步发送消息,或者同步发消息但重试次数为0。
  • 消息至少发送一次:producer同步发送消息,失败、超时都会重试。
  • 消息发且仅发一次:后续版本支持。

consumer视角

  • 消息最多消费一次:consumer先读取消息,再确认position,最后处理消息。
  • 消息至少消费一次:consumer先读取消息,再处理消息,最后确认position。
  • 消息消费且仅消费一次。

注意

  • 如果消息处理后的输出端(如db)能保证消息更新幂等性,则多次消费也能保证exactly once语义。
  • 如果输出端能支持两阶段提交协议,则能保证确认position和处理输出消息同时成功或者同时失败。
  • 在消息处理的输出端存储更新后的position,保证了确认position和处理输出消息的原子性(简单、通用)。

可用性

在kafka中,正常情况下所有node处于同步中状态,当某个node处于非同步中状态,也就意味着整个系统出问题,需要做容错处理。

同步中代表了:

  • 该node与zookeeper能连通。
  • 该node如果是follower,那么consumer position与leader不能差距太大(差额可配置)。

某个分区内同步中的node组成一个集合,即该分区的ISR。

kafka通过两个手段容错:

  •  数据备份:以partition为单位备份,副本数可设置。当副本数为N时,代表1个leader,N-1个followers,followers可以视为leader的consumer,拉取leader的消息,append到自己的系统中
  • failover

1. 当leader处于非同步中时,系统从followers中选举新leader

2. 当某个follower状态变为非同步中时,leader会将此follower剔除ISR,当此follower恢复并完成数据同步之后再次进入 ISR。

另外,kafka有个保障:当producer生产消息时,只有当消息被所有ISR确认时,才表示该消息提交成功。只有提交成功的消息,才能被consumer消费。

因此,当有N个副本时,N个副本都在ISR中,N-1个副本都出现异常时,系统依然能提供服务。

假设N副本全挂了,node恢复后会面临同步数据的过程,这期间ISR中没有node,会导致该分区服务不可用。kafka采用一种降级措施来处理:选举第一个恢复的node作为leader提供服务,以它的数据为基准,这个措施被称为脏leader选举。由于leader是主要提供服务的,kafka broker将多个partition的leader均分在不同的server上以均摊风险。每个parition都有leader,如果在每个partition内运行选主进程,那么会导致产生非常多选主进程。kakfa采用一种轻量级的方式:从broker集群中选出一个作为controller,这个controller监控挂掉的broker,为上面的分区批量选主。

一致性

上面的方案保证了数据高可用,有时高可用是体现在对一致性的牺牲上。如果希望达到强一致性,可以采取如下措施:

  • 禁用脏leader选举,ISR没有node时,宁可不提供服务也不要未完全同步的node。
  • 设置最小ISR数量min_isr,保证消息至少要被min_isr个node确认才能提交。

持久化

基于以下几点事实,kafka重度依赖磁盘而非内存来存储消息。

  • 硬盘便宜,内存贵
  • 顺序读+预读取操作,能提高缓存命中率
  • 操作系统利用富余的内存作为pagecache,配合预读取(read-ahead)+写回(write-back)技术,从cache读数据,写到cache就返回(操作系统后台flush),提高用户进程响应速度
  • java对象实际大小比理想大小要大,使得将消息存到内存成本很高
  • 当堆内存占用不断增加时,gc抖动较大
  • 基于文件顺序读写的设计思路,代码编写简单
  • 在持久化数据结构的选择上,kafka采用了queue而不是Btree
  • kafka只有简单的根据offset读和append操作,所以基于queue操作的时间复杂度为O(1),而基于Btree操作的时间复杂度为O(logN)
  • 在大量文件读写的时候,基于queue的read和append只需要一次磁盘寻址,而Btree则会涉及多次。磁盘寻址过程极大降低了读写性能

参考文档:

kafka官方文档

Kafka全解析

小白也能看懂的简单明了kafka原理解析

原文地址:https://www.cnblogs.com/liuys635/p/10807675.html

时间: 2024-08-18 06:26:25

kafka工作原理介绍的相关文章

Apache kafka 工作原理介绍

消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息.在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段.为了管理需要共享的信息,对应用提供公共的信息交换机制是重要的.常用的消息队列技术是 Message Queue. Message Queue 的通讯模式 点对点通讯:点对

Apache kafka 工作原理介绍(作者原创文章已发表在IBM开发者论坛)

插个广告:本人的<大话Java性能优化>一书99万字,已经在亚马逊.当当.京东.天猫,感谢对技术推广梦想者的支持,谢谢! 消息队列 消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待接收程序接收此消息.在分布式计算环境中,为了集成分布式应用,开发者需要对异构网络环境下的分布式应用提供有效的通信手段.为了管理需要共享的信息,对应用提供公共的信息交

GPRS DTU的工作原理介绍 GPRS DTU使用场合有哪些

DTU是Data Transfer unit的缩写,中文名称是数据传输 单元 ,用于在远端将PLC等下位机设备的数据透传到服务器上,专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过GPRS通信网络进行传送的无线终端设备. GPRS DTU是一种物联网无线数据终端,利用公用运营商网络GPRS网络(又称G网)为用户提供无线长距离数据传输功能. 采用高性能的工业级8/16/32位通信处理器和工业级无线模块,以嵌入式实时操作系统为软件支撑平台,同时提供RS232和RS485(或RS422)

陕西锅炉布袋除尘器工作原理介绍

陕西锅炉布袋除尘器介绍 陕西锅炉布袋除尘器燃煤烟气处理主要由上.下箱体.喷吹设备.过滤设备.气源.卸灰设备.风机等组成.锅炉布袋除尘器可完成在线与离线主动清灰,在灰斗的下装有叶轮给料机或螺旋输送机等排灰设备,当灰斗内的尘埃积累到必定程度时,排灰设备主动敞开完成定时 或定量排灰.锅炉布袋除尘器厂家0317拨5569122也可登陆http://www.hbcchb.com/phbdcc/gl.html 锅炉布袋除尘器选用优质碳钢作为首要原材料,耐高温PPS与复合式高温过滤原料处理了烟气中高温.酸碱.

新疆袋式除尘器工作原理介绍

新疆袋式除尘器介绍     新疆袋式除尘器依靠离心风机的负压把钢铁.冶金.化工.建材.有色金属.锅炉燃烧和生产制造中产生的扬尘和烟气,通过吸风管道引入袋式除尘器中,当高流速运行的烟气和扬尘,进入袋式除尘器箱体后,流通面积瞬间变大,流速瞬间降低,扬尘与烟气中含有的大颗粒粉尘,在自身重量的作用下慢慢降落到下方灰斗或仓低部,而烟气和扬尘没有降落的比重轻.颗粒小的粉尘,伴随着气体通过布袋由外向内进行过滤,粉尘被阻留在滤袋纤维层的外部,干净的气体在则透过布袋在负压作用下上升到净化室的箱体中,排放达标净化气

湖北回转反吹扁袋除尘器工作原理介绍

湖北回转反吹扁袋除尘器介绍     湖北回转反吹扁袋除尘器也称为ZC型机械回转反吹扁袋除尘器不受气源条件的限制,采用高压风机反吹清灰机制,主要应用在湖北各地的矿山采石场.铸造机械.建材和化工生产行业的扬尘收集.净化处理,具有结构合理.紧凑,安装.使用.维护简单的优点. 湖北回转反吹扁袋除尘器是用优质碳钢焊接制成的圆形上下箱体.旋转卸料阀.笼骨布袋.反吹风机.离心引风机等组成,根据处理扬尘风量大小.气体特性.过滤气体排放浓度设计生产.更多回转反吹扁袋除尘器详细资料可登陆http://www.hbc

宁夏PL单机除尘器的运行维护与工作原理介绍

PL单机除尘器是一种占空中积小,除尘效能高的小型单机布袋除尘器,重要由引风机.扁形滤袋.壳体.清灰电机构成,实用于车间内部消耗中的扬尘管理,如:车床加工.抛光打磨.陶瓷.玻璃.耐火质料制造等,满足安置空间小.处置处罚扬尘大.净化效能高的应用状态. 宁夏PL单机除尘器工作原理 宁夏PL单机除尘器经过与引风管道相连的吸尘罩把含尘气体吸入箱体,经过外滤式扁形滤袋进行过滤,滤袋内部有笼型框架作为支持,依托清灰电机动员连杆装置,把含尘气体过滤后,粘附在滤袋上的粉尘,定时抖落,让滤袋回复过滤功能,而粉尘则落

MongoDB复制集的工作原理介绍(二)

复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作,当空间用完时新记录自动覆盖最老的记录. 复制集中的从节点就是通过读取主节点上面的 oplog 来实现数据同步的,MongoDB的oplog(操作日志)是一种特殊的封顶集合,滚动覆盖写入,固定大小.另外oplog的滚动覆盖写入方式有两种:一种是达到设定大小就开始覆盖写入

spring @Scheduled定时任务使用说明及基本工作原理介绍

使用说明及工作原理: package com.example.spring.async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.example.spring.MyLog; /** * 定时任务使用示例 * 1.启动类增加注解 @EnableScheduling * 2.相应类声明为服务 @Servic