第一节 kafka 基础知识

Apache Kafka 不仅仅是消息引擎系统,还是一个分布式流处理平台。

要点

  • 简单介绍
  • 基本概念
  • 分区
  • 避免消息丢失
  • 拦截器
  • rebalance

1.基本介绍

kafka主要有两大应用:
1)构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
2)构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)

Kafka作为一个集群,运行在一台或者多台服务器上;Kafka 通过 topic 对存储的流数据进行分类。
每条记录中包含一个key,一个value和一个timestamp(时间戳)。
Kafka有四个核心的API:

  • The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
  • The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
  • The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
  • The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。

2. 基本概念

  • Record:消息,指Kafka处理对象
  • Topic:主题,用来承载消息的容器
  • Partition:分区,一个有序不变的消息队列,一个主题下可以有多个分区
  • Offset:消息位移,表示分区中每条信息的位置,是一个单调递增不变的值
  • Replica,副本,数据冗余机制(Replication)。
    -- 领导者副本(Leader Replica):对外提供服务,与客户端进行交互
    -- 追随者副本(Follower Replica):不能与外界进行交互,只是被动地追随领导者副本
  • Producer:生产者,向主题发布新消息的应用程序
  • Consumer:消费者,向主题订阅新消息的应用程序
  • Consumer Offset:消费者位移,表示消费者消费进度
  • Consumer Group:消费者组,多个消费者实例共同组成的一个组,同时消费多个分区来实现高吞吐。
  • Rebalance:重平衡,消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。它是Kafka消费者端实现高可用的重要手段

副本的工作机制:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息;至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。这样保证了数据的持久化和消息不丢失。

3.分区

主题-->分区-->消息
生产者将消息发送到主题,消费者订阅主题,而主题下是有不同分区了,消息是挂在不同的分区之下的。一个分区只能有一个消费者,不能出现多个消费者同时订阅一个分区。

Kafka 的三层消息架构:

  • 第一层是主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本
  • 第二层是分区层,每个分区的 N 个副本中只能有一个充当领导者角色,对外提供服务;其他 N-1 个副本是追随者副本,只是提供数据冗余之用
  • 第三层是消息层,分区中包含若干条消息,每条消息的位移从 0 开始,依次递增。最后,客户端程序只能与分区的领导者副本进行交互


    image.png

其实分区的作用就是提供负载均衡的能力,或者说对数据进行分区的的主要原因,就是为了实现系统的伸缩性。不同的分区放在不同的节点上,数据的读写针对分区这个粒度进行的。这样可以通过增加新节点实现增加系统的吞吐量。

消息分区策略:
分区策略:轮询策略(默认)、随即策略、按消息键保序策略、其他策略(如:基于地理位置进行分区)
自定义分区策略需要, 编写一个具体的类,实现org.apache.kafka.clients.producer.Partitioner接口,然后设置partitioner.class参数

如何实现因果关系消息的顺序行

    1. Kafka 主题设置单分区,也就是 1 个分区(不建议,丧失了 Kafka 多分区带来的高吞吐量和负载均衡的优势)
  • 2.基于个别字段进行分区

4.避免消息丢失

  • 消息丢失:
    Kafka只对已提交的消息做持久化工作保存
    提交不成功:网络抖动,消息不合格kafka拒绝接受
    总之,职责在于producer,不要使用 producer.send(msg),用producer.send(msg, callback) api

  • Consumer消费消息丢失:
    1)维持先消费消息(阅读),再更新位移(书签)的顺序
    2)如果是多线程异步处理消费消息,Consumer 程序不要开启自动提交位移,而是要应用程序手动提交位移

解决方案:

  • 不要使用 producer.send(msg),而要使用 producer.send(msg, callback)
  • 设置acks=all。acks是producer的一个参数,设置成all代表所有的broker都接收到信息,才算是已提交消息
  • 设置retries位一个较大值,代表重试次数(网络抖动)
  • 设置unclean.leader.election.enable=false。Broker参数,如果一个落后的borker变成leader,必然会造成消息丢失
  • 设置replication.factor >= 3。Broker参数,备份数,数据冗余避免丢失
  • 设置 min.insync.replicas > 1。Broker参数,这只消息至少呗写入多少个副本才算是已提交
  • 确保replication.factor > min.insync.repicas 。如果两个相等只要有一个副本机挂了,整个分区将无法正常工作
  • 设置enable.auto.commit=false。consumer的参数,确保消费完再提交

5.拦截器

Kafka 拦截器分为生产者拦截器和消费者拦截器,都支持链。
生产者拦截器要实现org.apache.kafka.clients.producer.ProducerInterceptor

消费者拦截器:org.apache.kafka.clients.consumer.ConsumerInterceptor

6.幂等性和事务

消息投递语义:

  • 最多一次:消息可能丢失,但绝对不会重复
  • 至少一次:消息不会丢失,但可能会重复
  • 精确一次:消息不会丢失,也不会重复

Kafka:默认至少一次,那么Kafka如何做到精确一次?
幂等性和事务!!!

  • 幂等性producer:
    很简单 就设置enable.idempotence=ture
    注意:
    1)只能保证单分片的幂等性
    2)会话幂等性,不能实现跨会话幂等性
  • 事务型producer:
    1)首先开启幂等性:enable.idempotence=ture
    2)其次设置 Producer 端参数 transctional.id
    事务型 Producer的事务 API: initTransaction、beginTransaction、commitTransaction 和 abortTransaction,它们分别对应事务的初始化、事务开始、事务提交以及事务终止.

Consumer需要设置隔离级别:
solation.level
1)read_uncommitted:默认读未提交
2)read_committed:读已提交

7.rebalance

  • Rebalance发生的时机有三个
    1)组成员数据量发生变化
    2)订阅主题数量发生变化
    3)订阅主题的分区数发生变化
    其中第一个最常见,后面两个通常是运维的主动操作,无法避免。主要还是针对组成员数量减少的情况。增加一般也是人为主动的。

那么如何避免因为参数或逻辑不合理而导致的成员退出,与之相关的主要参数
1)session.timeout.ms,推荐设置6s
2)heartbeat.interval.ms,推荐设置2s
3)max.poll.interval.ms,推荐设置比你的业务逻辑处理要长
4)GC参数,避免频繁的FULL GC

重平衡过程是如何通知到其他消费者实例的?
靠消费者端的心跳线程(Heartbeat Thread)
消费者定期的发生心跳请求到Broker端的协调者,以表明他还活着。当协调者决定开启新一轮平衡后,他会将“rebalance_in_progress”封装进心跳请求的响应中,返还给消费者实例。当消费者实例发现心跳响应中包含了“rebanlance_in_progress”,就能立马知道冲平生又开始了。
heartbeat.interval.ms控制重平衡通知的频率

8.Consumer Group

Consumer Group :Kafka提供的可扩展且具有容错性的消息者机制。

  • 消费者组的重要特征:
    A:组内可以有多个消费者实例(Consumer Instance)。
    B:消费者组的唯一标识被称为Group ID,组内的消费者共享这个公共的ID。
    C:消费者组订阅主题,主题的每个分区只能被组内的一个消费者消费
    D:消费者组机制,同时实现了消息队列模型和发布/订阅模型。

消费者组中的实例个数,最好与订阅主题的分区数相同,否则多出的实例只会被闲置。一个分区只能被一个消费者实例订阅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容