美文网首页
kafka中的topic、partition和offset

kafka中的topic、partition和offset

作者: 我也有键盘 | 来源:发表于2019-04-02 18:29 被阅读0次

一、简介


1. 什么是kafka

Kafka 是一款分布式消息发布和订阅系统,具有高性能、高吞吐量的特点而被广泛应用与大数据传输场景。它由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会的一个顶级项目。

2. kafka 产生背景

早期,kafka是用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)。先把各种活动数据以日志的形式写入某种文件,然后周期性的对这些文件进行统计分析。

3. kafka 的应用场景

由于 kafka 具有更好的吞吐量、内置分区、冗余及容错性的优点(kafka 每秒可以处理几十万消息),让 kafka 成为了一个很好的大规模消息处理应用的解决方案。在企业级应用里,主要用作:

  • 行为追踪

  • 日志收集

    总之, 套路就是 通过发布-订阅模式将数据写入对应的topic中,然后由后端平台进行进一步地处理

4. 基本架构组成
  • broker

  • producer

  • consumer group

  • zookeeper 集群

    Producer 使用 push 模式将消息发布到 broker,consumer 通过监听使用 pull 模式从 broker 订阅并消费消息。 多个 broker 协同工作,producer 和 consumer 部署在各个业务逻辑中。三者通过 zookeeper管理协调请求和转发。这样就组成了一个高性能的分布式消息发布和订阅系统。


    kafka frame.png

二 、集群搭建


1. 配置集群
  • conf/seervice.properties 需要修改的项

    broker.id=0/1/2...

    zookeeper.connect=zookeeperIp1:2081,zookeeper ip2:2081,zookeeper ip3:2081...

    listeners=PLAINTEXT://当前主机ip:9092

2. 启动集群
  • 启动配置的zookeeper集群/主机

  • 启动kafka

sh kafka-server-start.sh -daemon ..config/server.properties
3.kafka命令行
  • 创建topic test
sh kafka-topics.sh --create --zookeeper 192.168.1.110:2181 --replication-factor 1 --partitions 1 --topic test

replication-factor :副本
partitions:分区

  • 查看topic 列表
sh kafka-topics.sh --list --zookeeper 192.168.1.110
  • 控制台提供消息
sh kafka-console-producer.sh --broker-list 192.168.1.110:9092 --topic test
  • 控制台消费消息
sh kafka-console-consumer.sh --bootstrap-server 192.168.1.110:9092 --topic test --from-beginning

三、在代码里使用


1. 引入依赖
 <groupId>org.apache.kafka</groupId>
 <artifactId>kafka-clients</artifactId>
 <version>2.1.0</version>
</dependency>
2. 配置说明
producer配置项
  • batch.size (默认16KB) producer对于同一个分区来说,会按照batch.size的大小统一收集批量发送

  • linger.ms (默认0) 延迟后批量发送

    batch.size / linger.ms 只需满足其中一个,就会发送。因此这两个配置需要配合使用

  • max.request.size (默认1M) 请求的最大字节数 数据太大影响发送、接收性能

  • acks producer 发送消息到 broker 上以后的确认值。有三个可选项

    • 0:表示 producer 不需要等待 broker 的消息确认。这个选项时延最小但同时风险最大(因为当 server 宕机时,数据将会丢失)。

    • 1:表示 prod ucer 只需要获得 kafka 集群中的 leader 节点确认即可,这个选择时延较小同时确保了 leader 节点确认接收成功。

    • all(-1):需要 ISR 中所有的 Replica 给予接收确认,速度最慢,安全性最高,

Consumer配置项
  • GROUP_ID_CONFIG 消费组

    一个topic下的数据,对于一个groupId中的consumer来说是竞争的,即一条数据只能被一个consumer消费

    不同groupId,不存在竞争

  • AUTO_OFFSET_RESET_CONFIG

    earliest 对于新的groupId来说,重置offset,从最早的消息开始消费

    offset 偏移量,相当于一个指针或游标,指向的是当前分区数据的位置

    latest 对于新的groupId来说,取已经消费并且提交的最大offset 即取最近的一个值

    none 对于新的groupId,如果之前没有offset(新的group一定没有offset),会抛出异常(NoOffsetForPartitionException)

    none: throw exception to the consumer if no previous offset is found for the consumer's group

  • ENABLE_AUTO_COMMIT_CONFIG

    自动提交,消息消费后,如果不提交,可以一直消费。

    如果设置为false, 则可以通过 KafkaConsumer.commitAsync();手动提交

  • MAX_POLL_RECORDS_CONFIG

    设置每一次调用 poll() 返回的消息数,批量返回以减少poll()的次数,提升性能

3. Spring - boot整合kafka

四、kafka定义和原理


1. Topic 和 Partition
topic

topic是存储消息的逻辑概念,不同的topic下的数据是分开存储的。不同的 topic 的消息是分开存储的, 每个 topic 可以有多个生产者向它发送消息,也可以有多 个消费者去消费其中的消息。

topic.png
partition

一个 topic 可以划分多个分区(每个 Topic至少有一个分区),同一topic下的不同分区包含的消息是不同的。第i个分区分配在第 i mod n 个broker上。

每个消息在被添加到分区时,都会被分配一个offset(称之为偏移量),它是消息在此分区中的唯一编号,kafka通过offset 保证消息在分区内的顺序,offset的顺序不跨分区,即kafka 只保证在同一个分区内的消息是有序的。


partition.png
2. offset

每个消息在被添加到分区时,都会被分配一个 offset(称之为偏移量),它是消息在此分区中的唯一编号,kafka 通过 offset 保证消息在分区内的顺序。offset 的顺序不跨分区,即 kafka 只保证在同一个分区内的消息是有序的; 对于应用层的消费来说,每次消费一个消息并且提交以后,会保存当前消费到的最近的一个 offset。

3. 消息的分发策略

消息是kafka中最基本数据单元。一条消息由Key、Value两部分构成,其中,key可以指定也可以不指定。默认情况下,kafka 采用的是 hash 取模算法决定消息存储到哪个分区。如果Key 为 null,则会随机分配一个分区。

4. 消息的消费策略

一个consumer group-0 里有3个consumer时,他们一起消费topic.test,这个test下有3个分区,怎么协调?

c1消费p0,c2消费p1,c3消费p2

kafka的策略是:一个分区只能由一个消费者消费。

分区分配策略:

  • 范围分区(Range strategy 默认)

    范围分区策略先对一个主题里面的分区按照序号排序,并对消费者按字母顺序排序。对于如上3个分区,3个消费者,排序后:

    分区序列:0,1,2

    消费者序列:C1-0,C2-0,C3-0

    然后将分区数 / 消费者数 决定每个消费线程消费几个分区,最终

    C1-0 : p0

    C2-0:p1

    C3-0:p2

    如果2个主题,每个主题10个分区,group-0下的3个消费者怎么协调呢?

    C1-0 将消费 T1 主题的 0, 1, 2, 3 分区以及 T2 主题的 0,1, 2, 3 分区 C2-0 将消费 T1 主题的 4, 5, 6 分区以及 T2 主题的 4, 5, 6 分区 C3-0 将消费 T1 主题的 7, 8, 9 分区以及 T2 主题的 7, 8, 9分区

  • 轮询分配

    轮询分区策略是把所有 partition 和所有 consumer 线程都列出来,按照 hashcode 进行排序。然后将所有分区依次轮流分配给所有consumer。

5. 什么时候触发消费分配策略?

消费者分区分配策略又叫 consumer rebalance。当:

  • 一个consumer group里新增消费者

  • 有消费者离开当前的consumer group

  • topic新增分区

消费者 <= 分区数,若大于分区数,就会有闲置的消费者

partition最好是consumer的整数倍

相关文章

网友评论

      本文标题:kafka中的topic、partition和offset

      本文链接:https://www.haomeiwen.com/subject/uscnbqtx.html