消息队列分区
Partition 是什么?
Topic 被切成的多份,是并行和顺序的基本单位
类比:一条高速公路的多条车道,车各走各的道
它是什么
一个 Topic 可以分成多个 Partition,每个 Partition 是一个有序、追加写的日志文件,消息写进去就拿到一个递增的 offset。
分区分布在不同的 Broker 上,所以 Topic 的吞吐上限约等于「分区数 × 单分区吞吐」。
分区怎么决定
生产端指定了 key 就用 key 的哈希对分区数取模;没指定 key 就按粘性分区(一批消息发到同一分区,攒够再换)以提升批量效率。
- 同一个 key 一定进同一个分区,这是「局部有序」的实现方式
- 分区数只能增不能减,减少分区会破坏 key 与分区的映射
- 消费者数量超过分区数时,多出来的消费者会空闲
取舍
分区多并行度高,但会增加文件句柄、内存和故障恢复时间。经验值:单 Broker 上分区总数控制在几千以内,单分区数据量控制在几十 GB。