Kafka核心技术与实战
胡夕
人人贷计算平台部总监,Apache Kafka Contributor
立即订阅
8408 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学习Kafka?
免费
Kafka入门 (5讲)
01 | 消息引擎系统ABC
02 | 一篇文章带你快速搞定Kafka术语
03 | Kafka只是消息引擎系统吗?
04 | 我应该选择哪种Kafka?
05 | 聊聊Kafka的版本号
Kafka的基本使用 (3讲)
06 | Kafka线上集群部署方案怎么做?
07 | 最最最重要的集群参数配置(上)
08 | 最最最重要的集群参数配置(下)
客户端实践及原理剖析 (14讲)
09 | 生产者消息分区机制原理剖析
10 | 生产者压缩算法面面观
11 | 无消息丢失配置怎么实现?
12 | 客户端都有哪些不常见但是很高级的功能?
13 | Java生产者是如何管理TCP连接的?
14 | 幂等生产者和事务生产者是一回事吗?
15 | 消费者组到底是什么?
16 | 揭开神秘的“位移主题”面纱
17 | 消费者组重平衡能避免吗?
18 | Kafka中位移提交那些事儿
19 | CommitFailedException异常怎么处理?
20 | 多线程开发消费者实例
21 | Java 消费者是如何管理TCP连接的?
22 | 消费者组消费进度监控都怎么实现?
深入Kafka内核 (5讲)
23 | Kafka副本机制详解
24 | 请求是怎么被处理的?
25 | 消费者组重平衡全流程解析
26 | 你一定不能错过的Kafka控制器
27 | 关于高水位和Leader Epoch的讨论
管理与监控 (12讲)
28 | 主题管理知多少?
29 | Kafka动态配置了解下?
30 | 怎么重设消费者组位移?
31 | 常见工具脚本大汇总
32 | KafkaAdminClient:Kafka的运维利器
33 | Kafka认证机制用哪家?
34 | 云环境下的授权该怎么做?
35 | 跨集群备份解决方案MirrorMaker
36 | 你应该怎么监控Kafka?
37 | 主流的Kafka监控框架
38 | 调优Kafka,你做到了吗?
39 | 从0搭建基于Kafka的企业级实时日志流处理平台
高级Kafka应用之流处理 (3讲)
40 | Kafka Streams与其他流处理平台的差异在哪里?
41 | Kafka Streams DSL开发实例
42 | Kafka Streams在金融领域的应用
结束语 (1讲)
结束语 | 以梦为马,莫负韶华!
特别放送 (2讲)
加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘
用户故事 | 黄云:行百里者半九十
Kafka核心技术与实战
登录|注册

02 | 一篇文章带你快速搞定Kafka术语

胡夕 2019-06-06
你好,我是胡夕。今天我们正式开启 Apache Kafka 学习之旅。
在 Kafka 的世界中有很多概念和术语是需要你提前理解并熟练掌握的,这对于后面你深入学习 Kafka 各种功能和特性将大有裨益。下面我来盘点一下 Kafka 的各种术语。
在专栏的第一期我说过 Kafka 属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用甚至是每类数据都创建专属的主题。
向主题发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或多个主题发送消息,而订阅这些主题消息的客户端应用程序就被称为消费者(Consumer)。和生产者类似,消费者也能够同时订阅多个主题的消息。我们把生产者和消费者统称为客户端(Clients)。你可以同时运行多个生产者和消费者实例,这些实例会不断地向 Kafka 集群中的多个主题生产和消费消息。
有客户端自然也就有服务器端。Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。虽然多个 Broker 进程能够运行在同一台机器上,但更常见的做法是将不同的 Broker 分散运行在不同的机器上,这样如果集群中某一台机器宕机,即使在它上面运行的所有 Broker 进程都挂掉了,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(133)

  • huxi_2b 置顶
    结尾处增加了一张图,提炼了02中讲到的Kafka概念和术语,希望能够帮助到你:)
    2019-06-11
    3
    32
  • 明翼
    看了不少留言,大有裨益,算是总结。不从follower读几个原因:1,kafka的分区已经让读是从多个broker读从而负载均衡,不是MySQL的主从,压力都在主上;2,kafka保存的数据和数据库的性质有实质的区别就是数据具有消费的概念,是流数据,kafka是消息队列,所以消费需要位移,而数据库是实体数据不存在这个概念,如果从kafka的follower读,消费端offset控制更复杂;3,生产者来说,kafka可以通过配置来控制是否等待follower对消息确认的,如果从上面读,也需要所有的follower都确认了才可以回复生产者,造成性能下降,如果follower出问题了也不好处理
    2019-06-06
    5
    65
  • we
    老师 这个结构,为什么不用图表示。
    2019-06-06
    64
  • 时光剪影
    整理一遍个人的理解:

    Kafka体系架构=M个producer +N个broker +K个consumer+ZK集群

    producer:生产者

    Broker:服务代理节点,Kafka服务实例。
    n个组成一个Kafka集群,通常一台机器部署一个Kafka实例,一个实例挂了其他实例仍可以使用,体现了高可用

    consumer:消费者
    消费topic 的消息, 一个topic 可以让若干个consumer消费,若干个consumer组成一个 consumer group ,一条消息只能被consumer group 中一个consumer消费,若干个partition 被若干个consumer 同时消费,达到消费者高吞吐量

    topic :主题

    partition: 一个topic 可以拥有若干个partition(从 0 开始标识partition ),分布在不同的broker 上, 实现发布与订阅时负载均衡。producer 通过自定义的规则将消息发送到对应topic 下某个partition,以offset标识一条消息在一个partition的唯一性。
    一个partition拥有多个replica,提高容灾能力。
    replica 包含两种类型:leader 副本、follower副本,
    leader副本负责读写请求,follower 副本负责同步leader副本消息,通过副本选举实现故障转移。
    partition在机器磁盘上以log 体现,采用顺序追加日志的方式添加新消息、实现高吞吐量

    作者回复: 厉害!感觉比我写的简洁:)

    2019-06-16
    5
    33
  • 邋遢的流浪剑客
    如果允许follower副本对外提供读服务(主写从读),首先会存在数据一致性的问题,消息从主节点同步到从节点需要时间,可能造成主从节点的数据不一致。主写从读无非就是为了减轻leader节点的压力,将读请求的负载均衡到follower节点,如果Kafka的分区相对均匀地分散到各个broker上,同样可以达到负载均衡的效果,没必要刻意实现主写从读增加代码实现的复杂程度

    作者回复: 是的。前些天在知乎上就这个问题也解答了一下,有兴趣可以看看:https://www.zhihu.com/question/327925275/answer/705690755

    2019-06-06
    1
    28
  • 骨汤鸡蛋面
    建议在文章中使用topic、consumer 等代替 主题、消费者实例等表述,对了解kafka的人来说,更自然一点

    作者回复: 嗯嗯,好的:)

    2019-06-06
    18
  • 永光
    为什么 Kafka 不像 MySQL 那样允许追随者副本对外提供读服务?

    答:因为mysql一般部署在不同的机器上一台机器读写会遇到瓶颈,Kafka中的领导者副本一般均匀分布在不同的broker中,已经起到了负载的作用。即:同一个topic的已经通过分区的形式负载到不同的broker上了,读写的时候针对的领导者副本,但是量相比mysql一个还实例少太多,个人觉得没有必要在提供度读服务了。(如果量大还可以使用更多的副本,让每一个副本本身都不太大)不知道这样理解对不对?

    作者回复: 我个人觉得是很不错的答案,自己也学到了一些:)

    2019-06-10
    15
  • 莫道不销魂
    老师,我想问下
    1、 kafka是按照什么规则将消息划分到各个分区的?
    2、既然同一个topic下的消息分布在不同的分区,那是什么机制将topic、partition、record关联或者说管理起来的?

    作者回复: 1. 如果producer指定了要发送的目标分区,消息自然是去到那个分区;否则就按照producer端参数partitioner.class指定的分区策略来定;如果你没有指定过partitioner.class,那么默认的规则是:看消息是否有key,如果有则计算key的murmur2哈希值%topic分区数;如果没有key,按照轮询的方式确定分区。
    2. 这个层级其实是逻辑概念。在物理上还是以日志段(log segment)文件的方式保存,日志段文件在内存中有对应的Java对象,里面关联了你说的这些。

    2019-06-11
    1
    9
  • jacke
    胡老师:
           还想问个分区的问题,比如一个topic分为0,1,2 个分区
           写入0到9条消息,按照轮训分布:
                  0分区:0,1,2,9
                  1分区:3,4,5,
                  2分区:6,7,8
            那对于消费端来说,不管是p2p点对点模式,还是push/sub模式来说,
            如何保证消费端的读取顺序也是从0到9?因为0到9条消息是分布在3个
            分区上的,同时消费者是主动轮训模式去读分区数据的,
            有没有可能读到后面写的数据呢?比如先读到5在读到4?
            ps:刚开始学习,问题比较多,谅解
        

    作者回复: 目前Kafka的设计中多个分区的话无法保证全局的消息顺序。如果一定要实现全局的消息顺序,只能单分区

    2019-06-22
    1
    8
  • (´田ω田`)
    1、主题中的每个分区都只会被组内的一个消费者实例消费,其他消费者实例不能消费它。
    2、假设组内某个实例挂掉了,Kafka 能够自动检测到,然后把这个 Failed 实例之前负责的分区转移给其他活着的消费者。

    意思是1个分区只能同时被1个消费者消费,但是1个消费者能同时消费多个分区是吗?那1个消费者里面就会有多个消费者位移变量?
    如果1个主题有2个分区,消费者组有3个消费者,那至少有1个消费者闲置?

    作者回复: 在一个消费者组下,一个分区只能被一个消费者消费,但一个消费者可能被分配多个分区,因而在提交位移时也就能提交多个分区的位移。

    针对你说的第二种情况,答案是:是的。有一个消费者将无法分配到任何分区,处于idle状态。

    2019-06-06
    7
  • 然行
    kafka客户端读操作是会移动broker中分区的offset,如果副本提供读服务,副本更变offset,再回同步领导副本,数据一致性就无法得到保障
    2019-06-06
    1
    6
  • ban
    老师 这个结构,为什么不用图表示。
    2019-06-08
    5
  • dbo
    Myaql中从追随者读取数据对server和client都没有影响,而Kafka中从追随者读取消息意味着消费了数据,需要标记该数据被消费了,涉及到做一些进度维护的操作,多个消费实例做这些操作复杂性比较高,如果可以从追随者读也可能会牺牲性能,这是我的理解,请老师指正。

    作者回复: 我个人认为维护成本不高。Kafka中消费进度由clients端来操作,即消费者来决定什么时候提交位移,而且是提交到专属的topic上,与副本本身关联不大。实际上社区最近正在讨论是否允许follower副本提供读服务。不过我同意的是,follower副本提供读服务后会推高follower所在broker的磁盘读IO

    2019-06-06
    1
    4
  • 巧克力黑
    老师,你好
    假如只有一个Producer进程,Kafka只有一分区。Producer按照1,2,3,4,5的顺序发送消息,Kafka这个唯一分区收到消息一定是1,2,3,4,5么? Producer端,网络,数据格式等因素,会不会导致Kafka只有一个分区接收到数据顺序跟Producer发送数据顺序不一致

    作者回复: 如果retries>0并且max.in.flight.requests.per.connection>1有可能出现消息乱序的情况

    2019-07-02
    3
  • 趙衍
    我之前在学习Kafka的时候也有过这个问题,为什么Kafka不支持读写分离,让从节点对外提供读服务?
    其实读写分离的本质是为了对读请求进行负载均衡,但是在Kafka中,一个topic的多个Prtition天然就被分散到了不同的broker服务器上,这种架构本身就解决了负载均衡地问题。也就是说,Kafka的设计从一刻开始就考虑到了分布式的问题,我觉得这是Linkedln开发团队了不起的地方。
    尽管如此,我觉得还有一个问题我没有想明白,如果Producer就是对某些broker中的leader副本进行大量的写入,或者Consumer就是对某些broker中的leader副本进行大量的拉取操作,那单台broker服务器的性能不还是成为了整个集群的瓶颈?请问老师,这种情况Kafka是怎么解决的呢?

    作者回复: 只能是分散负载了,多做一些分区。

    2019-06-07
    3
  • QQ怪
    kafka能否做到多个消费者消费一个生产者生产的数据,并能保证每个消费者消费的消息不会重复,做到并行消费?

    作者回复: Kafka提供了消费者组实现你说的这个需求~~

    2019-06-06
    3
  • Mick
    老师,同一主题下的分区有没有可能到不同的borker上?同一分区的副本有没有可能在不同的borker上

    作者回复: “同一主题下的分区有没有可能到不同的borker上?” ——非常可能,而且也是期望的结果。

    “同一分区的副本有没有可能在不同的borker上” —— 必须如此。同一分区的不同副本必然在不同的broker上。

    2019-07-06
    2
  • 莫道不销魂
    老师 ,一个分区的N个副本是在同个Broker中的吗,还是在不同的Broker中,还是说是随机的?

    作者回复: 一个分区的N个副本一定在N个不同的Broker上。

    2019-07-02
    1
    2
  • sljoai
    老师,请问一下影响KafkaConsumer.poll能否读取出数据的因素有哪些呢?
    场景:使用assign的方式获取数据,且poll的超时时间设置成1s。
    1.消息本身较大时,当将max.partition.fetch.bytes设置成52428800(50MB)时无法读取出数据;当将max.partition.fetch.bytes变小些时,比如10M,就可以读取出数据。
    2.消息本身较小时,max.partition.fetch.bytes为50MB时,也能读取出数据;

    作者回复: 取不出数据时,有什么报错吗?另外你的fetch.max.bytes值多少?

    2019-06-11
    2
  • 大番茄
    首次接触kafka,有个理解疑问麻烦解惑:
        在:刚才提到的副本如何与这里的分区联系在 ,生产者向分区写入消息, 这个消息是和副本之间是种什么关系的啊?

    另外,这个关系老师可以出张图表示吗,感谢!
     
     

    作者回复: 就像专栏里面说的,副本是在分区层级下定义的,即一个分区能够配置多个副本。生产者向分区写消息时其实是向leader副本写消息。其他follower副本主动去leader副本拉取这条消息实现同步。不知道这么解释清楚点了吗

    2019-06-06
    2
收起评论
99+
返回
顶部