Kafka解析

www.jasongj.com/2015/01/02/Kafka深度解析

Terminology:

  1. Broker 
    Kafka集群包含一个或多个服务器,这种服务器被称为broker
  2. Topic 
    每条发布到Kafka集群的消息都有一个类别,这个类别被称为topic。(物理上不同topic的消息分开存储,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需指定消息的topic即可生产或消费数据而不必关心数据存于何处)
  3. Partition 
    parition是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量。每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件
  4. Producer 
    负责发布消息到Kafka broker
  5. Consumer 
    消费消息。每个consumer属于一个特定的consumer group(可为每个consumer指定group name,若不指定group name则属于默认的group)。使用consumer high level API时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。

架构: 

一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。  

Consumer Group 
High Level Consumer将从某个Partition读取的最后一条消息的offset存于ZooKeeper中( Kafka从0.8.2版本开始同时支持将offset存于Zookeeper中与将offset存于专用的Kafka Topic中 )。 这个offset基于客户程序提供给Kafka的名字来保存,这个名字被称为Consumer Group。 Consumer Group是整个Kafka集群全局的,而非某个Topic的。 每一个High Level Consumer实例都属于一个Consumer Group,若不指定则属于默认的Group。

Push vs. Pull

  作为一个messaging system,Kafka遵循了传统的方式,选择由producer向broker push消息并由consumer从broker pull消息。一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,采用非常不同的push模式。事实上,push模式和pull模式各有优劣。 
  push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。

Topic & Partition

  Topic在逻辑上可以被认为是一个queue。每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。

Kafka保证同一Consumer Group中只有一个Consumer会消费某条消息,实际上,Kafka保证的是稳定状态下每一个Consumer实例只会消费某一个或多个特定Partition的数据,而某个Partition的数据只会被某一个特定的Consumer实例所消费。 也就是说Kafka对消息的分配是以Partition为单位分配的,而非以每一条消息作为分配单元。 这样设计的劣势是无法保证同一个Consumer Group里的Consumer均匀消费数据,优势是每个Consumer不用都跟大量的Broker通信,减少通信开销,同时也降低了分配难度,实现也更简单。 另外,因为同一个Partition里的数据是有序的,这种设计可以保证每个Partition里的数据可以被有序消费。 
总结下来就是:每一个Consumer实例只会消费某一个或多个特定Partition的数据,而某个Partition的数据只会被某一个特定的Consumer实例所消费。

如果某Consumer Group中Consumer(每个Consumer只创建1个MessageStream)数量少于Partition数量,则至少有一个Consumer会消费多个Partition的数据,如果Consumer的数量与Partition数量相同,则正好一个Consumer消费一个Partition的数据。 而如果Consumer的数量多于Partition的数量时,会有部分Consumer无法消费该Topic下任何一条消息。

Consumer Rebalance的算法如下:

将目标Topic下的所有Partirtion排序,存于PT 
对某Consumer Group下所有Consumer排序,存于CG,第i个Consumer记为Ci 
N=size(PT)/size(CG),向上取整 
解除Ci对原来分配的Partition的消费权(i从0开始) 
将第i∗N到(i+1)∗N−1个Partition分配给Ci 
目前,最新版(0.8.2.1)Kafka的Consumer Rebalance的控制策略是由每一个Consumer通过在Zookeeper上注册Watch完成的。 每个Consumer被创建时会触发Consumer Group的Rebalance,具体启动流程如下:

High Level Consumer启动时将其ID注册到其Consumer Group下,在Zookeeper上的路径为/consumers/[consumer group]/ids/[consumer id] 
在/consumers/[consumer group]/ids上注册Watch 
在/brokers/ids上注册Watch 
如果Consumer通过Topic Filter创建消息流,则它会同时在/brokers/topics上也创建Watch 
强制自己在其Consumer Group内启动Rebalance流程

在这种策略下,每一个Consumer或者Broker的增加或者减少都会触发Consumer Rebalance。 因为每个Consumer只负责调整自己所消费的Partition,为了保证整个Consumer Group的一致性,当一个Consumer触发了Rebalance时,该Consumer Group内的其它所有其它Consumer也应该同时触发Rebalance。

如果想更深入的了解  请查看http://www.infoq.com/cn/profile/%E9%83%AD%E4%BF%8A

Kafka基础知识入门相关推荐

  1. swift5.x基础知识入门

    swift5.x基础知识入门 源码在我的主页下,欢迎下载,我非常喜欢swift和oc的语法,两者相似,我坚信天下没有学不会的技术. 基本介绍 ///这里只介绍一些初学swift的基本概念,需要提前了解 ...

  2. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  3. GIS地图基础知识--入门教程

    wenzhanhttp://www.gisbbs.net/viewthread.php?tid=106&extra=page%3D1 GIS地图基础知识--入门教程 GIS 地 图 知 识 1 ...

  4. C语言基础知识入门和C语言入门基础知识大全

    一.C语言基础知识入门 C语言一出现,就以其丰富的功能.强大的表达能力.灵活性.方便性和广泛的应用,在世界范围内迅速普及和普及.C语言不仅高效而且可移植.它可以用来开发应用软件.驱动程序.操作系统等. ...

  5. JavaScript 基础知识 - 入门篇(二)

    11. 函数 11.1 函数的基础知识 为什么会有函数? 在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余: 函数可以封装一段重复的javascript代码, ...

  6. R语言基础知识入门学习(一)

    目录 系列文章目录 一.软件下载 二.基本知识 1. 对象 2. 向量 3. 向量化 4. 因子 总结 系列文章目录 R语言基础知识入门学习(一) 一.软件下载 我们可以通过这个网址对R语言软件进行下 ...

  7. 网络安全基础知识入门!网络安全学习教程

    当我们学习网络安全的时候,需要对它的基础知识做一个简单的了解,这样对以后的学习和工作都会有很大的帮助.本篇文章为大家总结了网络安全基础知识入门的内容,快跟着小编来学习吧. 计算机网络 计算机网络是利用 ...

  8. 计算机网络建设中涉及到哪些硬件,网络基础知识入门

    网络基础知识入门 导语:随着计算机的广泛应用和网络的流行,我们应该要知道一些网络基础知识,下面是小编收集整理的网络基础入门知识,欢迎参考! 计算机网络是什么 这是首先必须解决的一个问题,绝对是核心概念 ...

  9. Python基础知识入门(二)

    Python基础知识入门(一) Python基础知识入门(三) Python基础知识入门(四) Python基础知识入门(五) 一.数字类型 Python 数字数据类型用于存储数值.数据类型是不允许改 ...

最新文章

  1. redis学习笔记——(1)
  2. 使用 Web Workers
  3. Linux内核中Makefile、Kconfig和.config的关系
  4. 解决jquery之get缓存问题的最简单方法
  5. qml调用python_QML使用Python的函数
  6. 【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法
  7. Android 手机震动提示效果 Android Vibrator 手机震动
  8. 基于libyuv库的NV12格式图片的缩放
  9. 数学符号归纳 常用数学符号名称中英文对照
  10. 基于网络视频监控的人员考勤系统设计
  11. COLA的扩展性使用和源码研究
  12. .Net Core 集成 RabbitMQ 订阅与发送
  13. 【Centos7.6安装CDH6.1.0】第二节 JDK、Mysql配置
  14. 数值实验-高斯核函数 python/matlab 实现
  15. 画火柴人动画的手机软件_火柴人动画制作软件(Pivot Stickfigure Animator)2.25 中文版附教程...
  16. 快速的绘制一幅可爱的柯基犬插图教程
  17. OSChina 周一乱弹 ——第一天上班,命都搭上了!
  18. 魔术师乔布斯,炼金术士苹果——苹果公司第四季度报表简评
  19. tsmc 7nm工艺下用做syncCell的stdCell介绍
  20. js,html,java文件压缩,pdf转word,图片等

热门文章

  1. jQuery UI Download
  2. 在 Windows 7 中安装上网认证客户端
  3. 正则化与L0、L1、L2范数略解
  4. 一些琐碎+分不清的知识点
  5. 【12】 全国外电音DJ 3000首 32G
  6. [云炬创业基础笔记]第七张创业团队测试3
  7. Python3打印当前系统时间
  8. 科大星云诗社动态20210322
  9. 云炬60s看世界20211128
  10. PyTorch 官方教程发布,限时免费开放!