当前位置: 首页 > news >正文

《中间件》——kafka的工作原理解析

-


目录


Kafka介绍


一、 Kafka的特性:


二、Kafka的使用场景


三、Kafka 生产者-消费者


四、Consumer与Partition的关系


五、Kafka 与 Zookeeper


一、Kafka介绍



Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。


二、Kafka的特性



- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。


- 可扩展性:kafka集群支持热扩展


- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失


- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)


- 高并发:支持数千个客户端同时读写


![](https://i-blog.csdnimg.cn/blog_migrate/03e881a7c920c8870336ae46eae9c2ec.png)


2.1 broker在zk中注册
kafka的每个broker(相当于一个节点,相当于一个机器)在启动时,都会在zk中注册,告诉zk其brokerid,在整个的集群中,broker.id/brokers/ids,当节点失效时,zk就会删除该节点,就很方便的监控整个集群broker的变化,及时调整负载均衡。


2.2 topic在zk中注册
在kafka中可以定义很多个topic,每个topic又被分为很多个分区。一般情况下,每个分区独立在存在一个broker上,所有的这些topic和broker的对应关系都有zk进行维护


2.3 consumer(消费者)在zk中注册
2.3.1     注册新的消费者,当有新的消费者注册到zk中,zk会创建专用的节点来保存相关信息,路径ls /consumers/{group_id}/  [ids,owners,offset],Ids:记录该消费分组有几个正在消费的消费者,Owmners:记录该消费分组消费的topic信息,Offset:记录topic每个分区中的每个offset


2.3.2     监听消费者分组中消费者的变化 ,监听/consumers/{group_id}/ids的子节点的变化,一旦发现消费者新增或者减少及时调整消费者的负载均衡。
 


![](https://i-blog.csdnimg.cn/blog_migrate/9a778baa6ce4d266b89612cd35628feb.png)


三、Kafka的使用场景



- 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。


- 消息系统:解耦和生产者和消费者、缓存消息等。


- 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。


- 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。


- 流式处理:比如spark streaming和storm


- 事件源


四、Kafka 生产者-消费者



消息系统通常都会由生产者,消费者,Broker三大部分组成,生产者会将消息写入到Broker,消费者会从Broker中读取出消息,不同的MQ实现的Broker实现会有所不同,不过Broker的本质都是要负责将消息落地到服务端的存储系统中。具体步骤如下:


生产者客户端应用程序产生消息:


客户端连接对象将消息包装到请求中发送到服务端


- 服务端的入口也有一个连接对象负责接收请求,并将消息以文件的形式存储起来


- 服务端返回响应结果给生产者客户端


- 消费者客户端应用程序消费消息:


客户端连接对象将消费信息也包装到请求中发送给服务端


- 服务端从文件存储系统中取出消息


- 服务端返回响应结果给消费者客户端


- 客户端将响应结果还原成消息并开始处理消息

![](https://i-blog.csdnimg.cn/blog_migrate/d828d07ad0eee8044de461438d1e962d.png)


五、Consumer与Partition的关系



- 如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,所以consumer数不要大于partition数


- 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配consumer数和partition数,否则会导致partition里面的数据被取的不均匀


- 如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition上数据是有序的,但多个partition,根据你读的顺序会有不同


- 增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的partition会发生变化


- High-level接口中获取不到数据的时候是会block的


负载低的情况下可以每个线程消费多个partition。但负载高的情况下,Consumer 线程数最好和Partition数量保持一致。如果还是消费不过来,应该再开 Consumer 进程,进程内线程数同样和分区数一致。


六、Kafka 与 Zookeeper



- Zookeeper 协调控制

1. 管理broker与consumer的动态加入与离开。(Producer不需要管理,随便一台计算机都可以作为Producer向Kakfa Broker发消息)


2. 触发负载均衡,当broker或consumer加入或离开时会触发负载均衡算法,使得一


   个consumer group内的多个consumer的消费负载平衡。(因为一个comsumer消费一个或多个partition,一个partition只能被一个consumer消费)


3.  维护消费关系及每个partition的消费信息。


- Zookeeper上的细节:

1. 每个broker启动后会在zookeeper上注册一个临时的broker registry,包含broker的ip地址和端口号,所存储的topics和partitions信息。


2. 每个consumer启动后会在zookeeper上注册一个临时的consumer registry:包含consumer所属的consumer group以及订阅的topics。


3. 每个consumer group关联一个临时的owner registry和一个持久的offset registry。对于被订阅的每个partition包含一个owner registry,内容为订阅这个partition的consumer id;同时包含一个offset registry,内容为上一次订阅的offset。


中间件系列篇


《Redis篇》——Redis快速入门


《Redis篇》——面试官最喜欢问的Redis知识


《Kafka篇》——Zookeeper搭载kafka消息发布和订阅


《Redis篇》——Redis的三种模式:主从、哨兵、集群


《Redis篇》——使用RedisTemplate对Redis的常用操作

http://www.rkmt.cn/news/1433708.html

相关文章:

  • 终极魔兽争霸III游戏优化工具:简单三步提升你的游戏体验
  • 2026 年 5 个最佳 Agent Skills 平台推荐
  • 3个关键词让你的小爱音箱智能下载歌曲:Xiaomusic语音指令实用指南
  • 手把手教你用VMware安装华为EulerOS 2.0 SP5(附详细分区与开发环境配置)
  • Qt版本管理实战:从5.12.3平滑降级到5.9.8,并让VS2022同时识别多个Qt版本
  • D3KeyHelper终极指南:5分钟掌握暗黑3自动化战斗技能宏工具
  • 别等硬盘挂了才后悔!保姆级教程:用smartctl给你的Linux服务器硬盘做个全面体检(附关键指标解读)
  • Debian11最小化安装后,浏览器中文乱码?5分钟搞定中文字体配置(附常用字体包清单)
  • 3大技术突破:douyin-downloader如何实现批量无水印视频的智能获取?
  • TCSVT期刊投稿实战:如何用LaTeX高效排版并处理图表与多媒体文件
  • LinkSwift:九大网盘直链解析工具,告别下载等待的终极解决方案
  • 统信UOS任务栏高效模式 vs 时尚模式,哪个更适合你的工作流?
  • 避坑指南:用铅画纸打印骰子教具,图案模糊、嵌套失败的3个关键原因与解决方案
  • 2026CRM软件大盘点:三梯队10款主流产品解析 - Joyky
  • UE5 RPG实战:手把手教你用GameplayEffect实现三种药水效果(瞬回、持续、Buff)
  • 告别文件互导!用Omniverse Live-Sync在UE和USD Composer之间玩转实时灯光与材质编辑
  • 3分钟找回Windows 11消失的任务栏拖放功能:零风险修复指南
  • NC65 后台SQL实战:科目余额表的多维度数据透视与聚合查询
  • 终极NCM音乐解密指南:3分钟快速解锁网易云加密音乐文件
  • 告别手动管理!用Unity Addressable系统实现资源热更新(含本地/远程路径配置详解)
  • 告别虚拟机!在Win10上用WSL2打造CentOS开发环境(含Git、Miniconda、VSCode配置)
  • 从‘半兰伯特’到屏幕色彩:拆解Unity渐变纹理Shader,理解它如何悄悄影响你的游戏画面
  • 即梦去水印教程:全场景即梦去水印方法适配图片视频各类导出需求 - 科技热点发布
  • 2026年5月北京国际小学推荐:五强榜专业评测学费性价比高注意事项 - 品牌推荐
  • 用Flask和Python爬取m3u8视频流:从本地保存到一键上传Cloudflare R2的完整流程
  • 宏洛图合作客户估值盘点:覆盖海内外大健康美妆全品类 - 宏洛图品牌设计
  • 告别df -h的迷惑:Ubuntu磁盘空间‘消失’的真相与两种扩容方案实战(命令行 vs GParted)
  • 基于Semantic Kernel与GPT-4构建AI驱动的商业SWOT分析生成器
  • 官渡区秋辰叉车租赁:西山专业的叉车台班租赁公司选哪家 - LYL仔仔
  • 5分钟永久备份QQ空间:GetQzonehistory全面数据备份方案