5、生产者消息分区机制原理剖析

1、为什么分区?

在 Kafka 中,主题只是逻辑容器,而实际承载数据的物理容器是分区

为什么 Kafka 要做这样的设计?为什么使用分区的概念而不是直接使用多个主题呢?
主要有以下 2 点考虑:

  • 负载均衡,高扩展:不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的读写请求处理。并且,我们还可以通过添加新的节点机器来增加整体系统的吞吐量。
  • 实现消息顺序:分区内消息有序

分区是常用的扩展方案,如 ElasticSearch 的分片,Redis 的分片等。

2、都有哪些分区策略?

所谓分区策略是生产者决定将消息发送到哪个分区的算法。

2.1、默认的分区策略

轮询策略

也称 Round-robin 策略,即顺序分配。比如一个主题下有 3 个分区,那么第一条消息被发送到分区 0,第二条被发送到分区 1,第三条被发送到分区 2,以此类推。当生产第 4 条消息时又会重新开始,即将其分配到分区 0,就像下面这张图展示的那样。
在这里插入图片描述
轮询策略是 Kafka Java 生产者 API 默认使用的分区策略,有非常优秀的负载均衡表现,它总是能保证消息最大限度地被平均分配到所有分区上,故默认情况下它是最合理的分区策略。

按消息键保序策略

Kafka 允许为每条消息定义消息键,简称为 Key。这个 Key 的作用非常大,它可以是一个有着明确业务含义的字符串,比如客户代码、部门编号或是业务 ID 等;也可以用来表征消息元数据。特别是在 Kafka 不支持时间戳的年代,在一些场景中,工程师们都是直接将消息创建时间封装进 Key 里面的。一旦消息被定义了 Key,那么你就可以保证同一个 Key 的所有消息都进入到相同的分区里面,由于每个分区下的消息处理都是有顺序的,故这个策略被称为按消息键保序策略,如下图所示。
在这里插入图片描述

2.2、自定义分区策略

如果要自定义分区策略,你需要显式地配置生产者端的参数 partitioner.class。这个参数该怎么设定呢?方法很简单,在编写生产者程序时,你可以编写一个具体的类实现 org.apache.kafka.clients.producer.Partitioner 接口。这个接口也很简单,只定义了两个方法:partition() 和 close(),通常你只需要实现最重要的 partition 方法。我们来看看这个方法的方法签名:

int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);

这里的 topic、key、keyBytes、value 和 valueBytes 都属于消息数据,cluster 则是集群信息(比如当前 Kafka 集群共有多少主题、多少 Broker 等)。Kafka 给你这么多信息,就是希望让你能够充分地利用这些信息对消息进行分区,计算出它要被发送到哪个分区中。只要你自己的实现类定义好了 partition 方法,同时设置 partitioner.class 参数为你自己实现类的 Full Qualified Name,那么生产者程序就会按照你的代码逻辑对消息进行分区。

总结

分区是实现负载均衡以及高吞吐量的关键,故在生产者这一端就要仔细盘算合适的分区策略,避免造成消息数据的 “倾斜”,使得某些分区成为性能瓶颈,这样极易引发下游数据消费的性能下降。

相关推荐

  1. QT5.14.2深入剖析Qt反射机制的实现原理

    2023-12-13 10:36:04       40 阅读
  2. Android 消息分发机制解读

    2023-12-13 10:36:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 10:36:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 10:36:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 10:36:04       82 阅读
  4. Python语言-面向对象

    2023-12-13 10:36:04       91 阅读

热门阅读

  1. logstash同步mysql数据到es(二、jdbc_driver_library问题)

    2023-12-13 10:36:04       52 阅读
  2. 企业核心架构(高可用 ,高并发 ,高复用)

    2023-12-13 10:36:04       62 阅读
  3. 时钟DS1302LCD

    2023-12-13 10:36:04       37 阅读
  4. 力扣-242. 有效的字母异位词

    2023-12-13 10:36:04       69 阅读
  5. Ajax 请求的原理

    2023-12-13 10:36:04       62 阅读
  6. LeetCode 2697. 字典序最小回文串

    2023-12-13 10:36:04       64 阅读