首页 > 其他分享 >kafka如何合理设置broker、partition、consumer数量

kafka如何合理设置broker、partition、consumer数量

时间:2024-08-28 12:25:50浏览次数:12  
标签:Partition partition Broker broker 消费 consumer 数量

目录

1.broker的数量最好大于等于partition数量

一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势。
一个broker如果对应多个partition,需要随机分发,顺序IO会退化成随机IO。

实验条件:3个 Broker,1个 Topic,无Replication,异步模式,3个 Producer,消息 Payload 为100字节:

场景1:partition数量 < Broker个数
当 Partition 数量小于 Broker个数时,Partition 数量越大,吞吐率越高,且呈线性提升。

Kafka 会将所有 Partition 均匀分布到所有Broker 上,所以当只有2个 Partition 时,会有2个 Broker 为该 Topic 服务。
3个 Partition 时,同理会有3个 Broker 为该 Topic 服务。

场景2:partition数量 > Broker个数
当 Partition 数量多于 Broker 个数时,总吞吐量并未有所提升,甚至还有所下降。

可能的原因是,当Partition数量为4和5时,不同Broker上的Partition数量不同,而 Producer 会将数据均匀发送到各 Partition 上,这就造成各Broker 的负载不同,不能最大化集群吞吐量。

总结:

  • 当broker数量大于partition数量,则有些broker空闲,此时增加partition会带来性能提升。而且是线性增长。
  • 当两者相等,则所有broker都启用,吞吐达到瓶颈。
  • 继续增加,则broker会不均衡,有点会分到更多的partition。
    顺序IO退化成随机IO。

2.consumer数量最好和partition数量一致

场景1:consumer数量 < partition数量
假设有一个 T1 主题,该主题有 4 个分区;同时我们有一个消费组 G1,这个消费组只有一个消费者 C1。
那么消费者 C1 将会收到这 4 个分区的消息。

如果我们增加新的消费者 C2 到消费组 G1,那么每个消费者将会分别收到两个分区的消息。

相当于 T1 Topic 内的 Partition 均分给了 G1 消费的所有消费者,在这里 C1 消费 P0 和 P2,C2 消费 P1 和 P3

场景2:consumer数量 = partition数量
如果增加到 4 个消费者,那么每个消费者将会分别收到一个分区的消息。 这时候每个消费者都处理其中一个分区,满负载运行。

场景3:consumer数量 > partition数量

但如果我们继续增加消费者到这个消费组,剩余的消费者将会空闲,不会收到任何消息。
总而言之,我们可以通过增加消费组的消费者来进行水平扩展提升消费能力。
这也是为什么建议创建主题时使用比较多的分区数,这样可以在消费负载高的情况下增加消费者来提升性能。

另外,消费者的数量不应该比分区数多,因为多出来的消费者是空闲的,没有任何帮助。

如果我们的 C1 处理消息仍然还有瓶颈,我们如何优化和处理?

把 C1 内部的消息进行二次 sharding,开启多个 goroutine worker 进行消费,为了保障 offset 提交的正确性,需要使用 watermark 机制,保障最小的 offset 保存,才能往 Broker 提交。

保证顺序性,避免大的offest先提交,小的offest挂了,重启后会消息丢失。
解决:开一个协程专门提交offest,保证只提交最小的,重复消费代替消息丢失。

场景4:添加consumer group支持多个应用消费partition的数据

Kafka 一个很重要的特性就是,只需写入一次消息,可以支持任意多的应用读取这个消息。 换句话说,每个应用都可以读到全量的消息。为了使得每个应用都能读到全量消息,应用需要有不同的消费组。

对于上面的例子,假如我们新增了一个新的消费组 G2,而这个消费组有两个消费者如图。 在这个场景中,消费组 G1 和消费组 G2 都能收到 T1 主题的全量消息,在逻辑意义上来说它们属于不同的应用。

3.总结

如果应用需要读取全量消息,那么请为该应用设置一个消费组;如果该应用消费能力不足,那么可以考虑在这个消费组里增加消费者。
1.broker的数量最好大于等于partition数量
2.consumer数量最好和partition数量一致

标签:Partition,partition,Broker,broker,消费,consumer,数量
From: https://www.cnblogs.com/even160941/p/18384396

相关文章

  • AT_code_festival_2017_qualc_d - Yet Another Palindrome Partitioning 题解
    YetAnotherPalindromePartitioning题解题目大意给出一个字符串,求把这个字符串划分成最少的小段,使每个小段都可以经过字母重组后为回文串。题目分析如果暴力的话,需要DFS段数、每一段的左节点、右节点,以及判断是否为回文串,时间复杂度在\(O(|S|^{|S|})\)左右。但是本......
  • 【Oracle点滴积累】解决ORA-06183 unable to extend index SYS.WRH$_SYSMETRIC_HISTOR
    广告位招租!知识无价,人有情,无偿分享知识,希望本条信息对你有用!今天和大家分享ORA-06183unabletoextendindexSYS.WRH$_SYSMETRIC_HISTORY_INDEXpartition错误的解决方法,本文仅供参考,谢谢!Solution:SELECTTABLESPACE_NAME,FILE_NAME,BYTES/1024/1024FILE_SIZE,AUTO......
  • IgniteFAQ-13-GridDhtPartitionsExchangeFuture : Failed to reinitialize local part
    报错2024-08-0815:29:02.532ERROR39656---[ange-worker-#49].c.d.d.p.GridDhtPartitionsExchangeFuture:Failedtoreinitializelocalpartitions(rebalancingwillbestopped):GridDhtPartitionExchangeId[topVer=AffinityTopologyVersion[topVer=1,minorTopVe......
  • from type [java.lang.String] to type [org. apache.kafka.clients.consumer.Consume
    kafka消费消息的时候,报错Noconverterfoundcapableofconvertingfromtype[java.lang.String]totype[org.apache.kafka.clients.consumer.ConsumerRecord<??>,没有消费到数据,这种情况可能是发送方发送的数据是封装了多个ConsumerRecord<??>对象发送过来的,需要用Consume......
  • OVER (PARTITION BY xx ORDER BY xx) 窗口函数理解
    SUM(sale_amount)OVER(PARTITIONBYsalespersonORDERBYsale_date)这段SQL窗口函数的详细解释和它在执行过程中所发生的具体细节如下:解析步骤窗口函数的基础定义:SUM(sale_amount):表示我们要对sale_amount列应用SUM聚合函数。OVER子句:指定窗口函数的范围和计算......
  • Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer
    前段时间在pulsar-client-go社区里看到这么一个issue:import"github.com/apache/pulsar-client-go/pulsar"client,err:=pulsar.NewClient(pulsar.ClientOptions{URL:"pulsar://localhost:6650",})iferr!=nil{log.Fatal(err)}consumer,er......
  • 解决 SandboxBroker.dll 缺失问题:Windows沙盒服务修复教程
    sandboxbroker.dll是Windows操作系统中用于沙箱(Sandbox)技术的组件之一。沙箱是一种安全机制,它允许应用程序在一个受限的环境中运行,从而保护系统免受潜在的恶意行为影响。sandboxbroker.dll主要负责协调沙箱内的进程与外部资源之间的交互,例如文件访问、注册表操作等。它在现代Wi......
  • 以块的形式处理大型 Spark DataFrame 的推荐方法是什么:“toPandas()”或“RDD.foreach
    我正在使用PySpark处理大型数据集,并且需要以每个500条记录的块的形式处理数据。我正在考虑使用toPandas()将我的SparkDataFrames转换为PandasDataFrames以方便分块或坚持使用SparkRDD,并使用foreachPartition()手动处理分块。以下是我正在考虑的示例方......
  • Chromium源码阅读(8):了解Base库里的PartitionAlloc模块
    Chromium代码库不是只使用malloc()。例如:渲染器(Blink)的大部分使用两个自制的分配器,PartitionAlloc和BlinkGC(Oilpan)。一些子系统(例如V8JavaScript引擎)可以自主处理内存管理。代码库的各个部分使用诸如SharedMemory或DiscardableMemory之类的抽象,与上述类似,它们有自己......
  • java8四个函数式接口:Function, Predicate, Consumer, Supplier使用
    目录1、前言2. 四大函数式接口1.Function,>2.Predicate 3.Consumer4.Supplier1、前言Java8引入了一种新的接口特性,叫做函数式接口。这种接口只能有一个抽象方法,通常用注解@FunctionalInterface标识。函数式接口可以被隐式地转换为lambda表达式。以下是一个......