分区器是生产者层面的负载均衡Kafka 生产者生产消息时,根据分区器将消息投递到指定的分区中所以 Kafka 的负载均衡很大程度上依赖于分区器。
- 如果 key 不为 null:对 Key 值进行 Hash 计算从所有分区中根据 Key 的 Hash 值计算出一个分区号;拥有相同 Key 值的消息被写入同一个分区;
- 如果 key 为 null:消息将以轮询的方式,在所有可用分区中分别写叺消息
如果不想使用 Kafka 默认的分区器,用户可以实现 Partitioner 接口自行实现分区方法。
- 在笔者的理解中分区器的负载均衡与顺序性有着一定程喥上的矛盾。
- 负载均衡的目的是将消息尽可能平均分配对于 Kafka 而言,就是尽可能将消息平均分配给所有分区;
- 如果使用 Kafka 保证顺序性则需偠利用到 Kafka 的分区顺序性的特性。
- 对于需要保证顺序性的场景通常会利用 Key 值实现分区顺序性,那么所有 Key 值相同的消息就会进入同一个分区这样的情况下,对于大量拥有相同 Key 值的消息会涌入同一个分区,导致一个分区消息过多其他分区没有消息的情况,即与负载均衡的思想相悖
- 并非分区数量越多,效率越高:
节点保存每个分区的这两个文件的文件句柄所以如果分区过多,ReplicaManager 需要保持打开状态的文件句柄数也就会很多
- 每个 Producer, Consumer 进程都会为分区缓存消息,如果分区过多缓存的消息越多,占用的内存就越大;
再均衡是消费者层面的负载均衡具体见前面的。