场景

一.消费任务挂掉或消费耗时很长

1.任务启动从上次提交offset处开始消费处理
2.如果是消费耗时过长则调整优化减少耗时

二.Kafka分区少了

如果数据量很大,合理的增加Kafka分区数是关键,要合理设置分区

确定分区数:创建一个只有1个分区的topic,然后测试这个topic的producer吞吐量和consumer吞吐量。假设它们的值分别是Tp和Tc,单位可以是MB/s。然后假设总的目标吞吐量是Tt,那么分区数
= Tt / max(Tp, Tc)

三.由于Kafka消息key设置的不合理,导致分区数据不均衡

可以在Kafka producer处,给key加随机后缀,使其均衡

一条消息如何知道要被发送到哪个分区?

1.默认情况下,Kafka根据传递消息的key来进行分区的分配,即hash(key) % numPartitions,保证了相同key的消息一定会被路由到相同的分区。
2.key为null时,从缓存中取分区id或者随机取一个。

Consumer消费Partition的分配策略

当以下事件发生时,Kafka 将会进行一次分区分配:

同一个 Consumer Group 内新增消费者
消费者离开当前所属的Consumer Group,包括shuts down 或
crashes 订阅的主题新增分区

Range strategy(默认)

Range策略是对每个主题而言的,首先对同一个主题里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。在我们的例子里面,排完序的分区将会是0, 1, 2, 3, 4, 5, 6, 7, 8, 9;消费者线程排完序将会是C1-0, C2-0, C2-1。然后将partitions的个数除于消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。在我们的例子里面,我们有10个分区,3个消费者线程, 10 / 3 = 3,而且除不尽,那么消费者线程 C1-0 将会多消费一个分区,所以最后分区分配的结果看起来是这样的:
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区

RoundRobin strategy
使用RoundRobin策略有两个前提条件必须满足:

同一个Consumer Group里面的所有消费者的num.streams必须相等;
每个消费者订阅的主题必须相同;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐