想象你负责管理一个大型快递分拣中心。每天有几百万个包裹从四面八方涌进来,每一个都必须按区域、按时效准确送达。这个中心里最值钱的东西不是仓库,而是那些分拣传送带——包裹进了哪条带子、带子上包裹的顺序如何、带子坏了一条会不会全盘停摆,直接决定了整个中心的效率和生死。 Kafka 的消息架构,就是一座这样的分拣中心。Topic 是分拣中心的“收件入口分类”,比如“生鲜入口”“电子产品入口”;而 Partition(分区) 则是入口后方一条条真实存在的分拣传送带。每条传送带有自己的编号、自己的排队顺序、自己的工人。你可以加传送带提升吞吐,也可以减少传送带给某些业务保序,但修错了带子,后期再想推倒重来,代价极其昂贵。 这篇文章将带你完整走一遍这套“传送带布局”的设计逻辑:分区到底扮演什么角色、吞吐从哪来、顺序如何在分区内保住、分区数该怎么规划、副本如何散落到不同车间、消费者怎么与传送带配合,以及最终怎么在吞吐、顺序、扩展、成本之间找到平衡。
对 AI 从业者而言,Topic 与 Partition 设计是消息队列架构的第一块基石。掌握分区规划 = 掌握 Kafka 吞吐上限的钥匙,也是架构师面试和高并发系统调优中绕不开的硬核技能。
可视化演示
展示线性回归最小二乘法拟合过程,包含散点数据拟合、梯度下降优化路径和残差分布分析,动态演示回归参数的优化与评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
最小二乘法线性回归拟合 散点数据点通过最小化残差平方和拟合最优回归直线 红色虚线表示每个数据点到回归线的残差距离 ŷ = β₀ + β₁x, min Σ(yᵢ - ŷᵢ)²
分区核心作用
想象你站在快递分拣中心的顶层俯瞰:入口处竖着几块巨大的指示灯牌,写着“生鲜”“电子产品”“服装”——这些分类就是 Topic。但真正干活的,是每个分类背后那一条条传送带。传送带不是装饰品,它是包裹真正的存放和搬运单元。在 Kafka 里,这条传送带就是 Partition(分区)。
Kafka 的 Topic 本身只是一个逻辑上的“分类名”,它不实际保存任何数据。真正保存数据的是 Topic 下的一个个分区。每个分区都是一个追加写入的日志文件,消息按到达顺序一个接一个往里排,排到的位置叫 offset(偏移量),相当于包裹上的流水号,从 0 开始一直递增。Kafka 对外承诺的是:这条传送带里的包裹顺序,跟卸货时完全一致。
更关键的是,分区的数量决定了 Kafka 能同时开几条处理线。消息一进入 Topic,就要通过面单上的 key 决定上哪条传送带:Kafka 对这个 key 做哈希,再对分区数取模,得到的余数就是最终落地的分区。这个路由公式是整个系统并行化的起点,也是后面所有顺序和吞吐问题的源头。
回到分拣中心的视角,你会立刻明白分区设计的分量:入口分类只是贴在墙上的标签,真正决定效率、容量和故障范围的,是传送带的数量和路由规则。分区就是 Kafka 世界里那条看得见摸得着的传送带——它是存储的最小单位、是复制的基本单元、也是并行处理的原点。
- 键值散列将消息携带的 key(比如订单号、用户 ID)送入哈希函数,得到一个大而均匀分布的整数,相当于给包裹面单盖上一个均匀散落的随机编号。
- 取模求余用这个散列值对分区总数取余,把结果约束在 0 到 N-1 之间,对应一条具体的传送带。
- 分区锁定最终确定这条消息写入哪个分区。key 相同则散列相同,余数也相同,所以相同的 key 永远进入同一条传送带,这是顺序保证的第一块基石。
吞吐并行之源
快递分拣中心要提升效率,最笨的方法是给一条传送带加速到极限——但传送带有物理速度上限,电机再强也扛不住包裹飞出去。聪明的做法是:多铺几条传送带,让包裹分流。Kafka 的吞吐设计正是这个思路。
在 Kafka 中,单条分区的吞吐受限于一块磁盘的顺序写速度、一张网卡的带宽、一个 Broker 进程的 CPU 处理能力。这就是 单分区吞吐上限。一旦你把数据分散到 N 个分区,而这些分区又恰好分布在多个 Broker 上,那么理论上总吞吐就是单分区吞吐的 N 倍。生产端可以同时往不同分区写,消费端可以同时从不同分区读,大家井水不犯河水。
需要注意的是,这个公式是理想模型。实际中多个分区如果落在同一个 Broker 上,会共享该 Broker 的磁盘和网卡,总吞吐就会打折扣。所以分区的价值,很大程度上取决于它们是否被合理地“摊开”到了不同的 Broker 上——传送带不能全堆在一个车间里,那样跟一条传送带没有本质区别。
- 单分区吞吐用变量 $C_{\text{partition}}$ 表示一条传送带在单位时间内能搬运的包裹数量,这是硬件和配置共同决定的物理极限。
- 分区数量用 $N_{\text{partitions}}$ 表示并行传送带的总条数。N 越大,同时运行的流水线越多。
- 相乘求总理想状态下,各分区互不争抢资源,系统总吞吐近似等于二者乘积——这就是 Kafka“加分区涨吞吐”的根本数学依据。
顺序保证机制
电商大促期间,同一个用户可能在一分钟内下了三个订单:创建、支付、发货。如果这三个消息被打进不同的传送带,后端三个不同的工人各拿一个包裹,看到的顺序就是乱套的。快递中心的解法很简单:把同一个客户的所有包裹贴同一个颜色标签,指定进同一条传送带。Kafka 的解法一模一样——用 key 做哈希路由,key 不变,落区不变。
Kafka 的顺序保证有严格的边界:它只保证分区内有序,不保证 Topic 全局有序。每个分区内部的 offset 是连续递增的,消费者按 offset 顺序读取消息,就像传送带上的包裹按流水号排队;但跨了分区,就没有任何全局编号可以比较先后。如果你需要全局有序,数学上只有一个办法:把分区数设为 1,让所有消息挤进同一条传送带——代价是吞吐上限直接掉到单分区水平。
作为架构师,你需要对业务语义做一次“分拣规则设计”:哪些 key 必须在一起?一起的 key 会产生多少吞吐?让同一个用户的消息永远走同一条传送带,就能在享受多分区并行吞吐的同时,守住业务关键路径上的顺序。记住,传送带可以很多,但同一位老客户的包裹,永远只走一条道。
- 偏移量定义每条消息进入分区时都会被分配一个递增的 offset(偏移量),类似传送带上的流水号 0、1、2、3。
- 大小比较比较两个 offset 的大小,小的一定是更早进入传送带的包裹。
- 顺序推论从大小关系推导出消费顺序——offset 小的消息必然先被消费者取走,这是 Kafka 对程序员的硬承诺。
分区规划策略
假设你要新建一座分拣中心,第一批传送带铺几条?铺少了,双十一凌晨包裹直接爆仓;铺多了,空荡荡的传送带天天空转,电费、场地、维护成本样样烧钱。分区规划就是在“够用”和“浪费”之间找那个平衡点。
业界常用的估算公式是:先算出满足目标吞吐最少需要多少分区,再乘以一个增长系数 g。增长系数一般取 1.5~3,给未来半年到一年的业务增长留余量。为什么必须留余量?因为分区数是路由公式的“模数”——一旦日后把 N 从 6 改成 12,所有已有 key 的取模结果都会漂移,原本聚在一起的同 key 消息会被拆散到不同分区,顺序保证瞬间失效,这是后期扩容最隐蔽的坑。
同时还要考虑消费者的规模:分区数最好不低于消费者组里的消费者数,否则会有人闲着没活干(详见后文)。但反过来,分区数也绝不是越大越好——每个分区都要占用文件句柄、内存索引和 ZooKeeper 元数据,还会拖慢 Rebalance。规划分区,本质上是在“未来扩展空间”和“当前运维成本”之间做一道谨慎的算术题。
- 目标吞吐分子 $T_{\text{target}}$ 是业务峰值时的期望吞吐,比如每秒 2 万条消息,这是设计的起点和硬指标。
- 单分区吞吐分母 $T_{\text{single}}$ 是压测得出的单分区实际吞吐,比如每秒 5 千条,代表一条传送带的真实搬运能力。
- 向上取整$\lceil \cdot \rceil$ 表示无论除出多少小数,都进位到整数,确保传送带数量只多不少。
- 增长系数乘以 g(通常 1.5~3),把未来业务扩张的余量提前铺进设计里,避免后期因扩容破坏 key 的映射关系。
副本分配规则
传送带虽然结实,但也有老化断裂的风险。快递中心怎么应对?办法是给每条关键传送带配“镜像备份”——在主传送带旁边建一条一模一样的备用线,而且绝不在同一个车间里。Kafka 里这个备份机制叫 副本(Replica),副本因子(Replication Factor)就是一条数据保留几份。
默认生产环境建议副本因子设为 3,即一个分区有 1 个 Leader 加 2 个 Follower。所有读写都走 Leader,Follower 只负责异步拉取同步。一旦 Leader 所在的 Broker 宕机,系统从 Follower 中选出新的 Leader,消息不丢、服务不断。这就是“主从同步机制”。副本分配时,Kafka 会自动把同一个分区的不同副本散落到不同 Broker,如果配置了机架感知(Rack Awareness),还会进一步跨机架、跨机房放置——相当于不光备份在其他车间,甚至备份到隔壁城市。
副本分配规则给分拣中心的启示很直接:传送带可以坏,但绝不能因为一个车间着火就让整个中心瘫痪。设计分区时,你不仅要问“铺多少条带子”,还要问“每一条带的备份放在哪”。副本布局的合理性,决定了 Kafka 在故障面前是优雅降级还是全线崩溃。
- 原始数据量$S_{\text{data}}$ 是所有分区消息净体积的总和,比如每天新增 1 TB 业务日志。
- 副本因子$R_f$ 是每条数据保存的份数,等于 1 个主副本加若干从副本的和,通常取 3。
- 相乘求总集群总存储需求等于原始数据量乘副本份数——3 副本就要准备 3 倍磁盘空间,这是高可用必须付的“保险费”。
消费者并行关系
传送带末端站着一排工人,他们是一个班的团队,叫 消费者组(Consumer Group)。这个团队有个硬规矩:一条传送带同一时间只能由一名工人处理,但一名工人可以同时看好几条带子。如果班里有 10 个工人,传送带只有 4 条,那 6 个人只能干看着;如果传送带 12 条、工人只有 4 个,每个人就得来回跑,一个人管 3 条带子。
这就是消费者并行度的核心公式:并行度 = 消费者数和分区数中较小的那个。消费者组里的每个消费者会被分配一个或多个分区,任何一条消息都只被组内一个消费者处理。想提升消费速度?要么增加消费者(但最多加到分区数那么多),要么增加分区数。两者必须匹配,否则就有人闲置或超载。
当消费者实例启停、分区数量调整或订阅关系变化时,消费者组会触发 Rebalance(重平衡)——相当于班长吹哨子让大家停下手中的活,重新分配传送带。这个过程中所有消费会短暂停顿,就像工人放下包裹重新站队。所以分区规划时一定要把未来的消费者扩张考虑进去:如果一个 Topic 铁定只会有 3 个消费者,你却只建 3 个分区,那以后想加人提速也加无可加。
- 消费者数量$C_{\text{consumer}}$ 是消费者组内的实例个数,相当于今天来上班的工人数。
- 分区数量$N_{\text{partition}}$ 是 Topic 的分区总数,相当于传送带条数,也是并行处理的上限。
- 取最小值$\min$ 运算把两个数中较小的那个作为实际并行度——人多带子少则人闲置,带子多人少则带子浪费。
平衡与权衡要点
讲到这里你会发现,Kafka 的分区设计没有标准答案,只有平衡。传送带铺太多,吞吐上去了,但维护成本和 Rebalance 负担同步上涨;传送带铺太少,顺序好保了,但吞吐卡脖子。真正的架构师做的是“配平”的功夫。
一个务实的综合估算公式,是把前面三个维度的约束同时放进一个式子里:目标吞吐要求的分区数、消费者组规模要求的分区数、Broker 集群均衡要求的分区数,取三者最大值后再乘增长系数。经验上,分区数最好是 Broker 数的整数倍或 2~3 倍,这样 Leader 副本能均匀分布在每台机器上,不会出现“一台机器累死、其他机器看戏”的热点效应。
回到快递分拣中心的终极比喻:设计一座中心,从来不是“传送带越多越厉害”,而是让传送带数量、工人班次、备份通道、场地成本四者咬合。Kafka 的分区也一样——它既是吞吐的引擎,也是顺序的边界,既是扩展的抓手,也是运维的账本。理解了分区,你就握住了 Kafka 架构设计的那根核心传送带。
- 吞吐约束项$\left\lceil\frac{T_{\text{target}}}{T_{\text{single}}}\right\rceil$ 保证容量够用,这是分区的“底线数量”。
- 消费者约束项$C_{\text{consumers}}$ 确保所有消费者都有分区可消费,避免团队资源浪费。
- Broker 均衡项$2 \times B_{\text{brokers}}$ 让分区数达到 Broker 数的两倍以上,便于 Leader 分散和后期 Rebalance 腾挪。
- 取最大再放余量$\max$ 选出最苛刻的那个约束,再乘以增长系数 g,得到一个兼顾当下与未来的推荐值。
AI 应用场景
电商订单状态流转
阶段:数据管道设计 / 消息路由
解决的问题:订单创建、支付回调、库存扣减、物流发货等事件必须按顺序处理,乱序会导致“订单已发货却还没创建”这类致命错误。传统做法是串行处理整个订单流,吞吐极低;AI 辅助的智能调度系统需要高并发事件流,同时要求同订单严格有序。
具体案例:某电商平台将订单 ID 作为消息 key,通过 partition = hash(order_id) % N 路由到固定分区。这样单个订单的创建→支付→发货事件永远落在同一分区,消费者按序处理;不同订单分散到不同分区并行处理,系统吞吐从每秒 2000 单提升到 3 万单。
埋点日志采集管道
阶段:数据采集 / 批量写入
解决的问题:APP 端每秒产生数百万条埋点日志,日志之间没有严格顺序要求,传统单队列写入根本无法承受峰值流量。AI 训练更是需要高吞吐、低延迟的日志流输入。
具体案例:某推荐系统团队为埋点 Topic 规划了 72 个分区(24 个 Broker × 3),生产者按随机 key 均匀写入,消费者组用 40 个实例并行消费。高峰期吞吐稳定在每秒 80 万条,且通过分区数的合理预留,大促流量翻倍时无需重建 Topic,只需横向扩充消费者实例。
实时风控特征计算
阶段:特征工程 / 实时推理
解决的问题:风控模型需要把同一设备 ID、同一用户的多条行为事件快速聚合并按序喂给模型。不同事件之间时序错乱会导致特征计算错误;同时风控链路又要求极低延迟和高并发,传统消息中间件难以兼顾。
具体案例:某金融科技公司将用户 ID 作为分区 key,保证同一用户的行为事件进入同一分区;同时将分区数设为消费组实例数的整数倍,使每个推理节点负载均衡。AI 风控模型实时消费分区消息,单条延迟低于 50ms,支撑了每秒 5 万次的风险决策。
Python 演示
import hashlibimport mathfrom collections import defaultdict def hash_key(key: str) -> int: """对 key 做一次稳定散列,返回非负整数。""" digest = hashlib.sha256(key.encode("utf-8")).hexdigest() return int(digest, 16) def partition_for(key: str, num_partitions: int) -> int: """消息路由:相同 key 永远进入相同分区。""" return hash_key(key) % num_partitions def estimate_partitions( target_tps: float, single_partition_tps: float, consumer_num: int, growth: float = 2.0,) -> int: """按吞吐需求、消费并行度、增长系数估算分区数。""" tps_partitions = math.ceil(target_tps / single_partition_tps) parallelism_partitions = consumer_num return int(max(tps_partitions, parallelism_partitions) * growth) def assign_partitions(num_partitions: int, consumer_num: int) -> dict: """把分区平均分配到消费者,模拟 Range 策略。""" assignment = defaultdict(list) for pid in range(num_partitions): owner = pid % consumer_num assignment[owner].append(pid) return dict(assignment) def simulate_day(max_partitions: int, target_tps: float, single_partition_tps: float) -> None: """演示不同分区数下的吞吐达标情况。""" print("=== Kafka 分区规划演示 ===") consumers = 8 for n in range(1, max_partitions + 1): capacity = n * single_partition_tps flag = "达标" if capacity >= target_tps else "不达标" print(f"分区数={n:2d} 理论容量={capacity:8.0f} TPS 目标={target_tps:.0f} TPS [{flag}]") plan = estimate_partitions(target_tps, single_partition_tps, consumers, growth=1.5) print(f"\n推荐分区数:{plan}") print(f"消费者数:{consumers},实际并行度:{min(plan, consumers)}") print("分配结果:", assign_partitions(plan, consumers)) if __name__ == "__main__": simulate_day(max_partitions=6, target_tps=20000, single_partition_tps=5000)
def hash_key(key: str) -> int:对消息 key 做 SHA-256 散列,得到稳定均匀的整数,模拟 Kafka 的哈希路由前的准备动作。return hash_key(key) % num_partitions取模确定分区号;key 相同则结果相同,这是同 key 消息进入同一分区的数学保证。tps_partitions = math.ceil(target_tps / single_partition_tps)按目标吞吐反推最少分区数,向上取整保证容量只多不少。parallelism_partitions = consumer_num第二个约束条件:分区数至少要等于消费者数,否则会有人闲着。return int(max(tps_partitions, parallelism_partitions) * growth)取两个约束的最大值再乘增长系数,得最终推荐分区数。capacity = n * single_partition_tps模拟不同分区数下的理论吞吐容量,直观展示“分区数 × 单分区吞吐”公式。flag = "达标" if capacity >= target_tps else "不达标"判断当前分区数能否覆盖目标吞吐,帮助我们快速定位最低分区门槛。print(f"消费者数:{consumers},实际并行度:{min(plan, consumers)}")用 min 公式打印实际消费并行度,验证消费者规模与分区数的匹配关系。
常见误区
误区只要我把分区数调大,Kafka 的吞吐就会一直线性上涨,所以分区设个几百上千准没错。
正解分区的吞吐收益受 Broker 硬件和集群总资源硬约束。当分区数超过单台 Broker 可承载的文件句柄、线程和网络连接上限后,吞吐不但不涨,反而会因为元数据膨胀、页缓存碎片化和 Leader 选举变慢而下降。传送带不是铺得越多越快——车间就那么大,带子铺太密,工人连站的地方都没有。
为何常见:初学者看到“总吞吐 = 分区数 × 单分区吞吐”的公式,误以为这是线性无上限的关系,忽略了公式成立的前提是各分区分散在足够多的 Broker 上且硬件足够空闲。
误区Kafka 后期发现吞吐不够,直接调大分区数就行,老数据还在,消费者照常消费,一切不变。
正解分区数变了,路由公式 hash(key) % N 的模数 N 变了,同一个 key 的取模结果大概率会漂移到新分区。原本同 key 聚在一起的消息被拆散到不同分区后,消费者读到的顺序就是乱的。这就好比传送带从 4 条加到 8 条,把同一客户的包裹按新规则重新分流,顺序全打散了。
为何常见:人们只看到“增加资源”的直觉,忽略了哈希路由对模数的强依赖,以为 Kafka 会自动保留原有的聚合关系。
误区Kafka 是消息队列,应该像 MySQL 事务日志一样保证所有消息严格有序,哪条先来哪条先被消费。
正解Kafka 只保证分区内有序。消息一旦跨分区,之间就没有任何先后顺序契约。想全局有序只有把分区数设为 1,但那样吞吐会断崖式下跌。业务上通常用“同 key 同分区”来保住关键路径顺序,而不是追求无谓的全局有序。
为何常见:把 Kafka 和 RabbitMQ 等单队列模型混为一谈,没意识到 Kafka 用“分区内有序 + 分区并行”换取了远超传统队列的吞吐能力。
误区Topic 消费变慢,那就多加几个消费者实例,人多力量大,速度自然就上去了。
正解消费者组内真正干活的并行度是 min(消费者数, 分区数)。如果消费者已经达到分区数,再加多少人都是空转——没有多余的分区可分给他们。想继续提速,必须先增加分区数,再增加消费者。工人数量超过传送带数量后,后面的人只能看着前面的人干活。
为何常见:把消费者并行度误解为无上限的资源堆叠,忽略了“一区同时只能被组内一个消费者消费”的硬性约束。
面试题
Q1. Kafka 中消息有序性的最小保证单位是?
- A.Topic 级别全序
- B.分区内部有序← 正确答案
- C.消费者内部有序
- D.Broker 内部有序
答案:B。Kafka 的顺序契约只落在分区内——同一分区的消息按 offset 递增排列,跨分区则无先后保证。这就好比同一客户包裹走同一条传送带才能保证顺序,换一条带子就说不清了。Topic 全局有序、消费者有序、Broker 有序都不是 Kafka 的保证模型。
Q2. 相同 key 的消息会被路由到哪里?
- A.随机选择一个分区
- B.固定落入同一分区← 正确答案
- C.选择负载最低分区
- D.同时写入所有分区
答案:B。路由公式是 hash(key) % N,同 key 散列值相同、取模结果相同,所以必然进入同一分区。这正是有状态消息按 key 聚合、保序的根本机制。随机、负载均衡、广播写入都不符合 Kafka 的默认路由逻辑。
Q3. 某 Topic 有 12 个分区,消费者组内有 5 个实例,实际消费并行度是?
- A.并行度等于 12
- B.并行度等于 5← 正确答案
- C.并行度等于 2
- D.并行度等于 60
答案:B。消费并行度 = min(消费者数,分区数) = min(5, 12) = 5。每个消费者至少能分到分区,团队里所有人都能派上活;但只有 5 个人,最多只能同时处理 5 条传送带。12 是分区上限,60 是乘积,都不符合并行度定义。
Q4. 分区数规划时最核心的计算依据是什么?
- A.目标吞吐除以单分区吞吐← 正确答案
- B.根据机器内存来估算
- C.根据消息大小来估算
- D.根据客户端语言种类
答案:A。分区数首要满足吞吐目标:先算出目标 TPS 需要几条“传送带”,再乘增长系数。内存、消息大小、客户端语言都不是分区数的一级决定因素,它们更多影响 Broker 配置和消息体设计。
Q5. 一个 Topic 已有 6 个分区,把分区数增加到 12 后,原有 key 的消息路由会怎样?
- A.映射一定保持稳定
- B.映射可能变化,顺序被打乱← 正确答案
- C.映射一定随之变化
- D.映射变化但顺序不受影响
答案:B。路由模数从 6 变成 12,hash(key) % 12 的结果大概率不同于 % 6,所以同 key 消息可能被拆到不同分区,顺序变乱。因此规划时就要留足余量。A 和 D 与哈希取模的数学事实不符。
Q6. 过度增加分区数的主要代价是什么?
- A.单分区容量会变小
- B.句柄元数据重平衡开销大← 正确答案
- C.消息体积会变小
- D.磁盘读写变成串行
答案:B。每个分区都要占用文件句柄、内存索引、Broker 元数据,分区过多还会让 Rebalance 更慢、Leader 选举开销更大。传送带太多,车间里连下脚的地方都没有。分区变多不会缩小分区容量,也不会改变消息体积或让磁盘变串行。
Q7. 分区副本的主要作用是什么?
- A.专门提高单分区吞吐
- B.保障高可用并承担故障转移← 正确答案
- C.大幅减少网络传输开销
- D.用来替代消费者组机制
答案:B。副本(Replica)是分区的“镜像备份”,当 Leader 所在 Broker 宕机时,Follower 中会选出新 Leader 继续服务。副本的职责是高可用与故障转移,不直接提升吞吐,也不减少网络开销,更与消费者组无关。
Q8. 触发消费者组 Rebalance 的常见因素有哪些?
- A.消费者实例的启停变化← 正确答案
- B.分区数量的动态变化← 正确答案
- C.消息内容格式发生变化
- D.消费组订阅列表发生变化← 正确答案
答案:ABD。Rebalance 本质是“重新排班”,触发条件是分组元数据变化:消费者实例增减、分区数增减、订阅 Topic 变化。消息内容格式变化只影响反序列化,不改变分组拓扑,不会触发重平衡。
Q9. 关于 Kafka 分区,下列说法正确的有哪些?
- A.分区是存储与并行的最小单位← 正确答案
- B.分区越多吞吐一定越高
- C.同一分区内偏移量递增有序← 正确答案
- D.分区副本可分散在不同 Broker← 正确答案
答案:ACD。分区确实既是存储单元也是并行单元(A 对);同一分区内 offset 单调递增、严格保序(C 对);副本会分散到不同 Broker 甚至不同机架(D 对)。但“分区越多吞吐越高”忽略了硬件资源上限,是典型的误区。
Q10. 设计生产级 Topic 的分区数时,需要考虑哪些输入?
- A.目标吞吐的峰值预测量← 正确答案
- B.消费者组的整体规模大小← 正确答案
- C.未来半年扩容余量预估← 正确答案
- D.是否有全局有序性需求← 正确答案
答案:ABCD。综合公式 max(吞吐所需分区, 消费者数, 2×Broker数) × 增长系数 说明:峰值吞吐决定分区底线,消费者规模决定并行匹配,增长系数预留未来,全局有序需求则可能迫使你大幅减少分区。四者缺一不可。