Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kafka中所谓的分区器,到底是什么?

Kafka中所谓的分区器,到底是什么?

作者头像
码农架构
发布于 2021-02-08 14:37:44
发布于 2021-02-08 14:37:44
1.2K0
举报
文章被收录于专栏:码农架构码农架构

消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器一般不是必需的,而序列化器是必需的。消息经过序列化之后就需要确定它发往的分区,如果消息 ProducerRecord 中指定了 partition 字段,那么就不需要分区器的作用,因为 partition 代表的就是所要发往的分区号。

如果消息 ProducerRecord 中没有指定 partition 字段,那么就需要依赖分区器,根据 key 这个字段来计算 partition 的值。分区器的作用就是为消息分配分区。

Kafka 中提供的默认分区器是 org.apache.kafka.clients.producer.internals.DefaultPartitioner,它实现了 org.apache.kafka.clients.producer.Partitioner 接口,这个接口中定义了2个方法,具体如下所示。

其中 partition() 方法用来计算分区号,返回值为 int 类型。partition() 方法中的参数分别表示主题、键、序列化后的键、值、序列化后的值,以及集群的元数据信息,通过这些信息可以实现功能丰富的分区器。close() 方法在关闭分区器的时候用来回收一些资源。

Partitioner 接口还有一个父接口 org.apache.kafka.common.Configurable,这个接口中只有一个方法:

注意:如果 key 不为 null,那么计算得到的分区号会是所有分区中的任意一个;如果key 为 null 并且有可用分区时,那么计算得到的分区号仅为可用分区中的任意一个,注意两者之间的差别。

在不改变主题分区数量的情况下,key 与分区之间的映射可以保持不变。不过,一旦主题中增加了分区,那么就难以保证 key 与分区之间的映射关系了。

除了使用 Kafka 提供的默认分区器进行分区分配,还可以使用自定义的分区器,只需同 DefaultPartitioner 一样实现 Partitioner 接口即可。默认的分区器在 key 为 null 时不会选择非可用的分区,我们可以通过自定义的分区器 DemoPartitioner 来打破这一限制,具体的实现可以参考下面的示例代码

实现自定义的 DemoPartitioner 类之后,需要通过配置参数 partitioner.class 来显式指定这个分区器。示例如下:

这个自定义分区器的实现比较简单,读者也可以根据自身业务的需求来灵活实现分配分区的计算方式,比如一般大型电商都有多个仓库,可以将仓库的名称或 ID 作为 key 来灵活地记录商品信息。

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kafka体系架构详细分解
我的个人博客排版更舒服: https://www.luozhiyun.com/archives/260
luozhiyun
2020/03/19
8480
Kafka - 3.x Kafka 生产者分区技巧全面指北
消息在通过 send()方法发往 broker 的过程中,有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器一般不是必需的,而序列化器是必需的。消息经过序列化之后就需要确定它发往的分区,如果消息 ProducerRecord 中指定了 partition 字段,那么就不需要分区器的作用,因为 partition 代表的就是所要发往的分区号。
小小工匠
2023/10/28
4410
Kafka - 3.x Kafka 生产者分区技巧全面指北
「kafka」kafka-clients,java编写生产者客户端及原理剖析
构建的消息对象ProducerRecord并不是单纯意义上的消息,它包含了多个属性,原本需要发送的业务相关的消息体只是其中的一个value属性,比如“hello world”,ProducerRecord的源码如下:
源码之路
2020/09/04
1.6K0
「kafka」kafka-clients,java编写生产者客户端及原理剖析
Kafka中生产消息时的三种分区分配策略
KafkaProducer在发送消息的时候,需要指定发送到哪个分区, 那么这个分区策略都有哪些呢? 我们今天来看一下
石臻臻的杂货铺[同名公众号]
2022/09/19
1.7K0
Kafka基础(二):生产者相关知识汇总
本文章部分内容摘自 朱忠华老师的《深入理解Kafka:核心设计与实践原理》,也特别推荐广大读者购买阅读。
create17
2019/06/24
9570
消息队列之Kafka-生产者
KafkaProducer 是线程安全的,可以在多个线程中共享单个 KafkaProducer 实例,也可以将 KafkaProducer 实例进行池化来供其他线程调用。
conanma
2022/04/08
5040
kafka学习笔记
kafka相关概念图 重点: kafka里的副本针对的是分区来做的, 副本不提供对外的服务,只记录消息数据,kafka通过对topic分区来实现消息系统的负载。
良辰美景TT
2022/05/13
3620
kafka学习笔记
Kafka核心API——Producer生产者
在上文中介绍了AdminClient API的使用,现在我们已经知道如何在应用中通过API去管理Kafka了。但在大多应用开发中,我们最常面临的场景就是发送消息到Kafka,或者从Kafka中消费消息,也就是典型的生产/消费模式。而本文将要演示的就是如何使用Producer API将消息发送至Kafka中,使应用成为一个生产者。
端碗吹水
2020/09/23
7270
Kafka核心API——Producer生产者
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/04/30
1.9K0
多图详解kafka生产者消息发送过程
Kafka 生产者解析
Producer 的拦截器(Interceptor)和 Consumer 的 Interceptor 主要⽤于实现Client端的定制化控制逻辑。 对于Producer⽽⾔,Interceptor使得⽤户在消息发送前以及Producer回调逻辑前有机会对消息做⼀些定制化需求,⽐如修改消息等。同时,Producer允许⽤户指定多个Interceptor按序作⽤于同⼀条消息从⽽形成⼀个拦截链(Interceptor Chain)。Intercetpor 的实现接⼝是org.apache.kafka.clients.producer.ProducerInterceptor,其定义的⽅法包括:
用户7353950
2022/06/23
5860
Kafka 生产者解析
【年后跳槽必看篇-非广告】Kafka核心知识点-第二章
所谓的消息幂等性就是如何保证消息只消费一次不重复消费。这需要从Kafka的多个角度去回答该问题一是要包含Kafka自身的机制,还需要考虑客户端自己的重复处理。
@派大星
2024/01/23
2650
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
在介绍Producer端原理之前,大家先对其整体架构有一个大致的了解,图示如下所示:
爪哇缪斯
2023/09/05
1930
连Producer端的主线程模块运行原理都不清楚,就敢说自己精通Kafka?
多图详解kafka生产者消息发送过程
KafkaProducer通过解析producer.propeties文件里面的属性来构造自己。 例如 :分区器、Key和Value序列化器、拦截器、RecordAccumulator消息累加器 、元信息更新器、启动发送请求的后台线程
石臻臻的杂货铺[同名公众号]
2022/09/26
6470
Kafka 自定义分区器
(1) 如果键值为 null,并且使用了默认的分区器,那么记录将被随机地发送到主题内各个可用的分区上。分区器使用轮询(Round Robin)算法将消息均衡地分布到各个分区上。 (2) 如果键不为空,并且使用了默认的分区器,那么 Kafka 会对键取 hash 值然后根据散列值把消息映射到特定的分区上。这里的关键之处在于,同一个键总是被映射到同一个分区上,所以在进行映射时,我们会使用主题所有的分区,而不仅仅是可用的分区。这也意味着,如果写入数据的分区是不可用的,那么就会发生错误。但这种情况很少发生。
CoderJed
2018/09/13
7500
Kafka学习(四)-------- Kafka核心之Producer
通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解。producer比consumer要简单一些。
大数据流动
2019/08/08
4320
专为实时而构建:使用Apache Kafka进行大数据消息传递 第2部分
在Apache Kafka简介的前半部分,您使用Kafka开发了几个小规模的生产者/消费者应用程序。从这些练习中,您应该熟悉Apache Kafka消息传递系统的基础知识。在下半部分,您将学习如何使用分区来分布负载并横向扩展应用程序,每天处理多达数百万条消息。您还将了解Kafka如何使用消息偏移来跟踪和管理复杂的消息处理,以及如何在消费者失败时保护您的Apache Kafka消息传递系统免于失败。我们将从第1部分开发用于发布 - 订阅和点对点用例的示例应用程序。
银河1号
2019/04/11
6960
专为实时而构建:使用Apache Kafka进行大数据消息传递 第2部分
进击消息中间件系列(五):Kafka 生产者 Producer
在消息发生的过程中,设计到了两个线程——main线程和Sender线程。在main线程中创建了一个双端队列线程将消息发给RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发送到Kafka Broker。
民工哥
2023/08/22
3730
进击消息中间件系列(五):Kafka 生产者 Producer
Kafka 发送消息过程中拦截器的用途?
消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截、序列化器 和 分区器 的一系列作用之后才能被真正地发往 broker。
码农架构
2021/02/05
9151
Kafka 发送消息过程中拦截器的用途?
玩转Kafka的生产者——分区器与多线程
上篇文章学习kafka的基本安装和基础概念,本文主要是学习kafka的常用API。其中包括生产者和消费者,
Janti
2018/08/20
1.8K0
玩转Kafka的生产者——分区器与多线程
Kafka精进 | 一文读懂Producer消息发送机制
前面我们总结了broker端的核心参数,一些服务端原理细节后面文章再聊。本文我们重点讨论Producer端的消息发送机制,希望通过本文我们能整体掌握Producer端的原理。
大数据技术架构
2020/04/21
2.6K1
Kafka精进 | 一文读懂Producer消息发送机制
相关推荐
Kafka体系架构详细分解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档