Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息

这篇具有很好参考价值的文章主要介绍了Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景及问题说明

使用 Kafka client 版本 3.4.0
目前的默认分区策略如下:

NOTE this partitioner is deprecated and shouldn't be used. To use default partitioning logic remove partitioner. class configuration setting. See KIP-794 for more info. The default partitioning strategy:

  • If a partition is specified in the record, use it
  • If no partition is specified but a key is present choose a partition based on a hash of the key
  • If no partition or key is present choose the sticky partition that changes when the batch is full. See KIP-480 for details about sticky partitioning.

渣翻+个人理解如下:
如果(producer)指定了分区,则使用指定的分区;
如果没有指定分区,但是使用了 key,则会基于 key 的 hash 选择一个分区;
如果没有指定分区也没有使用 key,选择当批处理满时改变的粘性分区(这里机翻了,大概意思就是会采用粘性分区策略),粘性分区策略详情查看 KIP-480: Sticky Partitioner

由于默认的粘性分区策略会导致短时间的的连续消息均被发送至同一个分区内,虽然时间拉长的话总体上仍然是平均的,但是碰到的业务需求需要尽可能每条都平均发到各个分区,所以选择修改配置,采用 RoundRobinPartitioner 使用轮询分区策略。

// ……
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"org.apache.kafka.clients.producer.RoundRobinPartitioner");
// ……

然后上线之后发现只向偶数分区发送消息:
Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息

问题排查及原因说明

其实也没什么排查过程,就是疯狂 Google,然后最终定位到了 Kafka 的一个 BUG,以及对应的(20年&21年提出但是目前还是 Open 的)PR:
https://issues.apache.org/jira/browse/KAFKA-9965
https://github.com/apache/kafka/pull/8690
https://github.com/apache/kafka/pull/11326

没有特别深入去了解细节,简单了解了一下原因:
Kafka 通过 KIP-480 引入了 Sticky Partitioner,Partitioner 引入了一个待实现的方法 onNewBatch()

顺便吐槽一下这个方法目前也已经 了,螺旋式上升是吧

根据 PR#11326 内的说法,没有实现这个方法导致 Partitioner 会调用两次 partition()。所以表现出来的就是:0-(+1+1)->2-(+1+1)->4 ...(理论上如果是从 1 开始的话就都是奇数了,但是没有发现)

解决方式

由于 PR 一直没有 merge,所以只能参照这个 PR 内容自定义实现一个 Partitioner。
然后选择使用这个自定义的 Partitioner

// ……
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "com.xxx.xxx.FixRoundRobinPartitioner");
// ……

上线后问题得到解决:
Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息文章来源地址https://www.toymoban.com/news/detail-854399.html

到了这里,关于Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kafka入门(九):kafka分区分配策略

    kafka分区分配策略 参数: Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下,此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka还提供了另外两种分配策略:RoundRobinAs

    2024年01月21日
    浏览(65)
  • kafka(一:分区数据不均衡(数据倾斜),分区分配策略)

    https://cloud.tencent.com/developer/article/1755177 可以设置一个新的列,根据这个列进行hash。

    2024年01月22日
    浏览(46)
  • 消息队列-Kafka-消费方如何分区与分区重平衡

    消费分区 资料来源于网络 消费者订阅的入口:KafkaConsumer#subscribe 消费者消费的入口:KafkaConsumer#poll 处理流程: 对元数据重平衡处理:KafkaConsumer#updateAssignmentMetadataIfNeeded 协调器的拉取处理:onsumerCoordinator#poll 执行已完成的【消费进度】提交请求的回调函数:invokeCompletedOff

    2024年04月14日
    浏览(32)
  • 详解Kafka分区机制原理|Kafka 系列 二

    Kafka 系列第二篇,详解分区机制原理。为了不错过更新,请大家将本号“ 设为星标 ”。 点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达 上一篇文章介绍了 Kafka 的基本概念和术语,里面有个概念是 分区(Partition)。 kafka 将 一个Topic 中的消息分成多份,分

    2024年02月14日
    浏览(36)
  • 《面试1v1》Kafka消息是采用Pull还是Push模式

    🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试 🍅 数十万人的面试选择: 面试说人话系列《面试1v1》 我是 javapub,一名 Markdown 程序员从👨‍💻,

    2024年02月15日
    浏览(36)
  • kafka分区分配策略

    现有主流消息中间件都是生产者-消费者模型,主要角色都是:Producer - Broker - Consumer,上手起来非常简单,但仍有需要知识点需要我们关注,才能避免一些错误的使用情况,或者使用起来更加高效,例如本篇要讲的kafka分区分配策略。 在开始前我们先简单回顾一下kafka消息存储

    2024年02月16日
    浏览(43)
  • KafKa 分区,副本实战

    5个broker (1主4从) 安装目路/config/server.properties, 额外复制4份为 server-2.properties,server-3.properties,server-4.properties,server-5.properties 主要配置不同 server.properties server-2.properties server-3.properties server-4.properties server-5.properties 运行这5个broker 创建一个主题test,8个分区,3个副本 bootstrap

    2024年02月11日
    浏览(38)
  • kafka分区策略

    目录 前言: 分区策略  轮询策略  随机策略  按消息键保序策略 自定义分区策略  参考资料       我们都知道kafka以高吞吐闻名,那为什么kafka能支持很高的吞吐量勒? 其中有一个重要的原因就是使用了分区, 我们知道kafka是按照主题存储消息的,其实kafka是按照如下三层

    2024年02月15日
    浏览(35)
  • 【基础】Kafka -- 主题与分区

    主题管理包括创建主题、查看主题消息、修改主题以及删除主题等操作,Kafka 提供的 kafka-topics.sh 脚本来执行这些操作,脚本位于 $KAFKA_HOME/bin/ 目录下,该脚本实际上是调用了 kafka.admin.TopicCommand 类来执行主题管理的操作。 简单创建与查看 若 broker 端的配置参数 auto.create.top

    2023年04月22日
    浏览(35)
  • kafka topic分区数设定

    然后假设总的目标吞吐量是Tt,那么分区数=Tt / min(Tp,Tc) 例如:producer吞吐量 = 70m/s;consumer吞吐量 =100m/s,期望吞吐量 300m/s; 分区数 = 300 / 70 = 4或者5个分区

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包