kafka学习笔记

  • kafka属于消息引擎系统, 主要用于系统间传输消息, 可以做到系统业务上的解耦, 缓冲系统上下游瞬时突发流量,使其更平滑(削峰填谷)。

kafka系统里各种概念

  • 消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
  • kafka的各种概念如下图所示:
    kafka相关概念图

    重点: kafka里的副本针对的是分区来做的, 副本不提供对外的服务,只记录消息数据,kafka通过对topic分区来实现消息系统的负载。

其他

kafka版本

生产者

生产者发送数据流程
  • 如果想指定生产者发消息的分区策略, 可以在生产端配置参数: partitioner.class, 对应的class需要实现: org.apache.kafka.clients.producer.Partitioner 这个接口。
  • 生产者默认的分区策略是根据消息指定的key发送到指定的分区(这也是生产者保证消息有序性的要点),如果消息没有指定key, 采用的是轮询策略。具体可以看 DefaultPartitioner这个类的实现
  • 为了提高生产者的发送效率, 在发送消息的时候, 可以对要发送的消息做压缩处理。配置参数为: "compression.type"。 启用压缩需要在生产端的cpu资源有多余的情况下(一般业务系统都是I/O密集型的)。
  • kafka发送的消息, 在发送的时候, 会把多条消息放在一起, 组成消息集合,在Broker端存的消息是发送端发送的"消息集合"
  • 避免在Broker配置compression.type, 防止Broker端配置的compression.type跟生产端配置的不一样, 如果配置的不一样, Broker需要对消息集合做解压缩, 让后用Broker配置的压缩算法重新压缩消息, 对Broker的性能有极大的影响。
  • 解压缩发生在Consumer端, 压缩算法在消息集合里。
  • 压缩算法的对吧吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;而在压缩比方面,zstd > LZ4 > GZIP > Snappy。
  • 发送消息的时候, 一定要用通过回调方法验证消息是否发送成功, 不然发送端有可能会有丢消息的风险。
  • 设置 retries 为一个较大的值,当出现网络的瞬时抖动时,消息发送可能会失败,此时配置了 retries > 0 的 Producer 能够自动重试消息发送,避免消息丢失。

生产端TCP连接相关

  • KafkaProducer 实例创建时启动 Sender 线程,从而创建与 bootstrap.servers 中所有 Broker 的 TCP 连接。
  • KafkaProducer 实例首次更新元数据信息之后,还会再次创建与集群中所有 Broker 的 TCP 连接。
  • 如果 Producer 端发送消息到某台 Broker 时发现没有与该 Broker 的 TCP 连接,那么也会立即创建连接。
  • 如果设置 Producer 端 connections.max.idle.ms 参数大于 0,则步骤 1 中创建的 TCP 连接会被自动关闭;如果设置该参数 =-1,那么步骤 1 中创建的 TCP 连接将无法被关闭,从而成为“僵尸”连接。

消费者

消费者总体工作流程
消费者初始化流程
消费者组消费详细流程
  • Consumer分区的分配策略是在消费端来处理的, 并非在Broker端做的分配方案,
  • kafka中消费者组是一个很重要的概念, 消费者通过Group_Id来标识自己属于那一个消费者组, 消费者组整体消费某一个Topic, 每个分区只会有一个消费者组的消费者来消费。
  • Consumer端有个参数enable.auto.commit,把它设置成false,并采用手动提交位移的方式。
  • partition.assignment.strategy:消费者分区分配策略,默认策略Range+CooperativeSticky。Kafka可以同时使用多个分区分配策略。可以选择的策略包括:Range、RoundRobin、Sticky、CooperativeSticky
  • 注意消费端如果掉线了, 或者执行的任务过程, 会导致消费端触发“重平衡”, 重平衡是很重的操作, 需要尽量避免
  • __consumer_offsets 主题里面采用 key 和 value 的方式存储数据。key 是group.id+topic+分区号,value 就是当前 offset 的值。每隔一段时间,kafka 内部会对这个 topic 进行compact,也就是每个 group.id+topic+分区号就保留最新数据。
  • Consumer offset是很重要的, 可以参考这篇文章: https://blog.csdn.net/warybee/article/details/121990020

Broker端

Zookeeper中存储的Kafka 信息
  • 设置 unclean.leader.election.enable = false,它控制的是哪些 Broker 有资格竞选分区的 Leader。如果一个 Broker 落后原先的 Leader 太多,那么它一旦成为新的 Leader,必然会造成消息的丢失。故一般都要将该参数设置成 false,即不允许这种情况的发生。
  • 设置 replication.factor >= 3, 最好将消息多保存几份,毕竟目前防止消息丢失的主要机制就是冗余
  • 设置 min.insync.replicas > 1, 控制的是消息至少要被写入到多少个副本才算是“已提交”。设置成大于 1 可以提升消息持久性。在实际环境中千万不要使用默认值 1。
  • 确保 replication.factor > min.insync.replicas。如果两者相等,那么只要有一个副本挂机,整个分区就无法正常工作了。我们不仅要改善消息的持久性,防止数据丢失,还要在不降低可用性的基础上完成。推荐设置成 replication.factor = min.insync.replicas + 1。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • 文章目录 第 1 章 Kafka 概述[http://dreamphp.cn/blog/detail?blog_i...
    Sql强阅读 283评论 0 2
  • kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。...
    dev_winner阅读 490评论 0 2
  • 一、Kafka简介 Kafka (科技术语)。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规...
    边学边记阅读 1,669评论 0 14
  • 版本选择 0.7版本:只有基础消息队列功能,无副本;打死也不使用 0.8版本:增加了副本机制,新的producer...
    问道2022阅读 264评论 0 1
  • 基础概念 Topic 一个topic相当于一个数据库中的表,同一类数据“存储”在一个topic中。topic只是一...
    仰望forward阅读 408评论 0 0