kafka原理介绍以及简单测试

一、原理介绍

1. topic, partition和offset的关系:

每个topic可以划分多个partition, 同一个partition里包含的消息是不同的。每个消息在被添加到分区时,都会被分配一个 offset,它是消息在此分区中的唯一编号,Kafka 通过 offset 保证消息在分区内的顺序,offset 的顺序不跨分区,即 Kafka 只保证在同一个分区内的消息是有序的。

kafka原理介绍以及简单测试

2. partition和replication-factor:

(1) partition, 消息会通过负载均衡发布到不同的分区上,当broker和partions一样时,就均匀分布在不同的broker上,那生产者该如何决定一条消息该投递到哪个partition呢?

The default partitioning strategy:

If a partition is specified in the record, use itIf no partition is specified but a key is present choose a partition based on a hash of the keyIf no partition or key is present choose a partition in a round-robin fashion

默认的分区策略是:

  • 如果在发消息的时候指定了分区,则消息投递到指定的分区
  • 如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择一个分区
  • 如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分区

(2) replication-factor用来设置topic的副本数。每个主题可以有多个副本,副本位于集群中不同的broker上,也就是说副本的数量不能超过broker的数量,否则创建主题时会失败。

3. partition, consumer group和consumer

kafka原理介绍以及简单测试

同一时刻,一条消息只能被消费者组中的一个消费者实例消费。

group.id是一个字符串,唯一标识一个consumer group;

consumer group下可以有一个或多个consumer instance,consumer instance可以是一个进程,也可以是一个线程;

consumer group下订阅的topic下的每个分区只能分配给某个group下的一个consumer(当然该分区还可以被分配给其他group)

消费者组订阅这个主题,意味着主题下的所有分区都会被组中的消费者消费到,如果按照从属关系来说的话就是,主题下的每个分区只从属于组中的一个消费者,不可能出现组中的两个消费者负责同一个分区。如果消费者实例的数量大于分区数,那么按照默认的策略(PS:之所以强调默认策略是因为你也可以自定义策略),有一些消费者是多余的,一直接不到消息而处于空闲状态。

可以通过消费者配置中
partition.assignment.strategy参数来指定分配策略

消费者分区分配策略:

(1) range策略针对的是主题,分配的时候

  • 首先,将分区按数字顺序排行序,消费者按消费者名称的字典序排好序
  • 然后,用分区总数除以消费者总数。如果能够除尽,则皆大欢喜,平均分配;若除不尽,则位于排序前面的消费者将多负责一个主题

例如,假设有两个消费者C0和C1,两个主题t0和t1,并且每个主题有3个分区,分区的情况是这样的:t0p0,t0p1,t0p2,t1p0,t1p1,t1p2

那么,基于以上信息,最终消费者分配分区的情况是这样的:

C0: [t0p0, t0p1, t1p0, t1p1]

C1: [t0p2, t1p2]

(2) roundrobin(轮训)

轮训与前面的range策略最大的不同就是它不再局限于某个主题,而是转载链接分区。

缺点:组中每个消费者订阅的主题不一样,分配过程仍然以轮询的方式考虑每个消费者实例,但是如果没有订阅主题,则跳过实例。当然,这样的话分配肯定不均衡

例如,假设有两个消费者C0和C1,两个主题t0和t1,每个主题有3个分区,分别是t0p0,t0p1,t0p2,t1p0,t1p1,t1p2

那么,最终分配的结果是这样的:

C0: [t0p0, t0p2, t1p1]

C1: [t0p1, t1p0, t1p2]

4. rebalance

rebalance本质上是一种协议,规定了一个consumer group下的所有consumer如何达成一致来分配订阅topic的每个分区。比如某个group下有20个consumer,它订阅了一个具有100个分区的topic。正常情况下,Kafka平均会为每个consumer分配5个分区。这个分配的过程就叫rebalance。

rebalance的两种分配策略就是前面所讲的range和round-robin

二、测试

1. 创建单分区单节点的topic:

# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test-topic

2. 查看topic列表:

# ./bin/kafka-topics.sh --list --zookeeper localhost:2181

3. 查看topic详情:

# ./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test-topic

Topic:test-topic PartitionCount:1 ReplicationFactor:1 Configs: Topic: test-topic Partition: 0 Leader: 1 Replicas: 1 Isr: 1

4. 生产:

# echo "hello" | kafkacat -b localhost:9092 -t test-topic -P

5. 消费:

# kafkacat -C -b localhost:9092 -t test-topic

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值