首页 > 其他分享 >Kafka 采用 RoundRobinPartitioner 时仅向偶数分区发送消息

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

时间:2024-04-17 12:01:07浏览次数:24  
标签:KIP 时仅 分区 partition Kafka Partitioner key 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");
// ……

然后上线之后发现只向偶数分区发送消息:
image

问题排查及原因说明

其实也没什么排查过程,就是疯狂 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");
// ……

上线后问题得到解决:
image

标签:KIP,时仅,分区,partition,Kafka,Partitioner,key,RoundRobinPartitioner
From: https://www.cnblogs.com/cbc-onne/p/18140043

相关文章

  • [转]Kafka与RabbitMQ区别
    Kafka和RabbitMQ都是流行的消息传递系统,但它们在设计和用途上有一些重要的区别。以下是它们之间的一些主要区别:1.消息传递模型:Kafka:Kafka是一个分布式流处理平台,主要用于处理实时数据流。它采用发布-订阅模型,消息被持久化保存在日志中,允许多个消费者以不同的速率消费消息。......
  • 用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本
    在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件?为了测试实际项目中的海豚定时调度从Kafka到HDFS的Kettle任务情况,特地提前跑一下海豚定时调度这个任务,看看到底什么......
  • Flume 整合 Kafka_flume 到kafka 配置【转】
    1.背景先说一下,为什么要使用Flume+Kafka?以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将Flume聚合后的数据输入到Storm等分布式计算框架中,可能就会超过集群的处理能力,这时采用Kafka就可以起到削峰的......
  • Kafka消息可视化工具:Offset Explorer(原名kafka Tool)的使用方法【转】
    OffsetExplorer(以前称为KafkaTool)是一个用于管理和使用ApacheKafka®集群的GUI应用程序。它提供了一个直观的界面,允许用户快速查看Kafka集群中的对象以及集群主题中存储的消息。它包含面向开发人员和管理员的功能。一些主要功能包括:快速查看所有Kafka集群,包括其代理,主题和......
  • kafka
    高性能之道Kafka的特性之一就是高吞吐率,但是Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,但是Kafka即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。Kaf......
  • Kafka如何保证消息的顺序性
    Kafka发布模式通过一系列机制来确保消息的顺序性,特别是在分区内部。以下是关键要点:1.分区机制:Kafka的核心机制之一是分区(Partition)。每个主题(Topic)可以被分割成多个分区,而消息在发布时会被追加到特定的分区中。在每个分区内部,消息是按照它们被追加的顺序来存储的,因此保证了分区......
  • 【ALL】Kafka从抬脚到入门
    一、Kafka简介1.1、定义旧定义Kafka是一个分布式的基于发布/订阅模式的消息队列。新定义Kafka是一个开源的分布式事件流平台,用于数据管道、流分析、数据集成和关键任务的应用。1.2、使用场景主要用于大数据实时处理领域。缓冲:有助于控制和优化数据流经过系统的速度......
  • Kafka做消息队列的原理
    Kafka作为消息队列的实现原理主要基于其分布式架构和日志式存储机制。以下是Kafka作为消息队列工作的核心原理:1.分布式架构与分区:Kafka采用分布式架构,将数据分布存储在多个节点(称为Broker)上,以实现数据的水平扩展和并行处理。Kafka中的消息流被组织成主题(Topic),每个主题可以包......
  • docker-compose部署kafka
    docker-compose.ymlversion:'2'services:zookeeper:image:develop-harbor.geostar.com.cn/3rd/zookeeper:3.5.5ports:-"2181:2181"kafka:image:develop-harbor.geostar.com.cn/3rd/wurstmeister/kafka:2.12-2.2.1......
  • kafka集群
    对于运维需要掌握的kafka基础操作,读写管理掌握后,下一步就是集群部署搭建了。1.kafka天然支持集群2.kafka将集群状态写入zookeeper。集群部署1.确保zk启动[devops03root/opt/kafka_2.11-2.4.0]#netstat-tunlp|grep2181tcp600:::2181......