Kafka如何将消息发送到指定分区

背景

面试一个时,面试官问了一个问题,Kafka如何做到顺序消息。我回答只给Kafka的Topic创建一个分区,发送到该Topic的消息在Kafka中就是有序的。

面试官又问,如果Topic有多个分区呢?我回答消息发送者在发送消息的时候,指定分区进行发送,可以在发送消息时,每次指定相同的Key。但是面试官说这样做不到,我后面去查了资料,是可以做到的,我当时也没有反驳,毕竟我是一个求职者,跟面试官产生冲突也不太好。而且可能面试官也只知道其他的方式,不知道基于这种方式可以将消息发送到指定分区。

写个博客记录下。

有哪些方式可以将消息发送到指定分区?

当一个Topic中有多个分区的时候,如何将消息发送到指定分区呢?

方式一:基于key

下面的第二个参数,partitionA就是message的key。
Kafka会将具有相同的key的消息发送到同一分区,这是通过哈希函数实现的。
此外,Kafka会按照消息产生的顺序被一致性的接受,这就保证了同一分区内消息的顺序性。

kafkaProducer.send("order-topic", "partitionA", "critical data");
kafkaProducer.send("order-topic", "partitionA", "more critical data");
kafkaProducer.send("order-topic", "partitionA", "another more critical data");

方式二:自定义分区器

Kafka允许自定义分区器,允许用户根据Topic、message key、message val、cluster等信息,自定义将消息发送到哪个分区。

自定义分区器:

public class CustomPartitioner implements Partitioner {// PREMIUM的意思是额外加价private static final int PREMIUM_PARTITION = 0;// NORMAL的意思是正常、标准private static final int NORMAL_PARTITION = 1;@Overridepublic int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {String customerType = extractCustomerType(key.toString());// 判断提取出的单词里面是否含有premium,如果有,则将其发送到第0号分区,否则发送到第1号分区。// 美团外卖有个加钱提前送达的服务,可以采用这种方式来实现。return "premium".equalsIgnoreCase(customerType) ? PREMIUM_PARTITION : NORMAL_PARTITION;}private String extractCustomerType(String key) {String[] parts = key.split("_");return parts.length > 1 ? parts[1] : "normal";}
}

在创建KafkaTemplate时,将自定义分区器设置到KafkaTemplate的属性里面去

// 在实际的SpringBoot项目中,可以将这个KafkaTemplate注入到Spring容器中
private KafkaTemplate<String, String> setProducerToUseCustomPartitioner() {Map<String, Object> producerProps = KafkaTestUtils.producerProps(embeddedKafkaBroker.getBrokersAsString());producerProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);producerProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);producerProps.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, CustomPartitioner.class.getName());DefaultKafkaProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<>(producerProps);return new KafkaTemplate<>(producerFactory);
}

测试代码。
将高级客户订单和普通客户订单区分开来,进行不同的处理。

// 在实际的SpringBoot项目中,可以从Spring容器中获取这个KafkaTemplate
KafkaTemplate<String, String> kafkaTemplate = setProducerToUseCustomPartitioner();
// 根据自定义分区器,当key为123_premium,则消息会被发送到第0号分区。
kafkaTemplate.send("order-topic", "123_premium", "Order 123, Premium order message");
// 根据自定义分区器,当key为456_normal,不含有premium,则消息会被发送到第1号分区。
kafkaTemplate.send("order-topic", "456_normal", "Normal order message");

方式三:直接指定分区序号

第二个参数0、1就是指定的分区号码,发送消息时,直接指定分区,将消息发送到指定的分区。

kafkaProducer.send("order-topic", 0, "123_premium", "Premium order message");
kafkaProducer.send("order-topic", 1, "456_normal", "Normal order message");

其他方式

在下面的参考文章当中,还看到了一个粘性分区器,但是没看太懂,而且不为大家所熟知,所以就没有太关注。
将数据发送到 Kafka 中的特定分区

参考

将数据发送到 Kafka 中的特定分区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

袁庭新ES系列17节|Spring Data Elasticsearch基础

前言 为了简化对Elasticsearch的操作Spring Data提供了Spring Data Elasticsearch。Spring Data Elasticsearch是Spring Data技术对Elasticsearch原生API封装之后的产物&#xff0c;它通过对原生API的封装&#xff0c;使得程序员可以简单的对Elasticsearch进行各种操作。接下来…

信融算网,创启未来 | 移动云一体化算网调度平台发布

4月29日上午&#xff0c;中国移动算力网络大会“自主可控算力网络应用”分论坛在苏州召开&#xff0c;中国移动云能力中心副总经理吴世俊、中国移动信息技术中心副总经理陈国出席论坛并发表致辞。论坛发布全国首个实现通算、智算、超算、量子计算&#xff0c;以及网络、安全一站…

全栈开发之路——前端篇(2)文件、组件与setup引入

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 本文系该系列第二篇&#xff0c;主要将介绍各个文件的意义、组件结构与导入以及setup的引入。 目录 一、src外文件介绍.gitignore为git忽略文件env.d.ts用于识别其他文件index.htmljson文件vite.confi…

【JAVASE】带你了解的方法魅力

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 …

java 基础面试-- hashCode 方法重要性及使用

引言 在Java编程的世界里&#xff0c;hashCode方法扮演着至关重要的角色&#xff0c;尤其在涉及到集合类&#xff08;如HashMap、HashSet&#xff09;和对象比较的场景中。本文将深入探讨hashCode方法的工作原理、重要性以及如何正确地重写它&#xff0c;以确保你的程序在性能…

[C++][算法基础]四种基本背包问题(动态规划)

1. 01背包问题 有 &#x1d441; 件物品和一个容量是 &#x1d449; 的背包。每件物品只能使用一次。 第 &#x1d456; 件物品的体积是 &#x1d463;&#x1d456;&#xff0c;价值是 &#x1d464;&#x1d456;。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体…

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程&#xff08;API 可以认为是 应用层 和 传输层 之间交互的路径&#xff09;&#xff08;API:Socket API相当…

RK3399平台Android7系统编译及问题解决

目录 【Android系统编译】 平台&#xff1a; Android编译&#xff1a; 烧写固件路径&#xff1a; 【android版本号查看】 【RK3399开发环境搭建】 4.1 JDK 安装 4.2 Linux 服务器开发环境搭建 4.2.1 发布包使用 Linux 服务器系统版本 4.2.2 网络环境搭建 4.2.3 软件…

【树——数据结构】

文章目录 1.基本概念2.基本术语1.结点之间的关系描述2.结点&#xff0c;树的属性描述3.有序树&#xff0c;无序树4.森林 3.树的性质考点1考点2考点3考点4 4.树的存储结构5.树和森林的遍历 1.基本概念 结点&#xff0c;根节点&#xff0c;分支结点&#xff0c;叶子结点&#xf…

Redis系列-1 Redis介绍

背景&#xff1a; 本文介绍Redis相关知识&#xff0c;包括Redis的使用、单线程机制、事务、内存过期和淘汰机制。后续将在《三方件-3 Redis持久化机制》中介绍Redis基于RDB和AOF的持久化机制&#xff1b;在《三方件-4 Redis集群》介绍主从、哨兵和Cluster集群相关的内容&#…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

Element对象

Element对象 Element是一个通用性非常强的基类&#xff0c;所有Document对象下的对象都继承自它&#xff0c;这个对象描述了所有相同种类的元素所普遍具有的方法和属性&#xff0c;一些接口继承自Element并且增加了一些额外功能的接口描述了具体的行为&#xff0c;例如HTMLEle…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…

Windows环境下基于CMake构建Lua

Windows环境下基于CMake构建Lua 环境&#xff01;&#xff01;&#xff01;注意&#xff1a; lua-5.4.6.tar.gz压缩包中&#xff0c;并未提供luac.c文件&#xff0c;无法构建luac.exe&#xff0c;可以从lua-5.4.5.tar.gz压缩包中拷贝使用 一、搭建基于CMake构建的Lua环境二、构…

Python-快速搭建一个管理平台

目录 &#x1f4dc; 准备工作 一、项目介绍 ✨ 二、制作数据库表 添加信息 ⚒️ 三、运行client.exe &#x1f680; 1、连接数据库&#xff0c;选择对应表&#xff0c;生成代码 2、把后端代码依次复制到项目中 3、把前端代码依次复制到前端项目中 4、添加路由 四、运行后端项目…

python生成随机字符串

随机字符的场景大致有以下场景&#xff1a; 1.产生随机字符串 无数字 2.产生随机长度的字符串 无数字、有数字 3.产生随机手机号 4.产生随机n位的数字 5.产生随机n以内的数字 随机使用的两种思路如下&#xff1a; 一&#xff1a;使用random.randint(0,n) 我们有一个包含…

《21天学通C++》(第十三章) 类型转换运算符

1.为什么需要类型转换&#xff1f; ①兼容不同类型&#xff1a; 在C中不同类型的数据不能直接进行运算&#xff0c;如需要则要进行类型转换 ②指针转换&#xff1a; 在处理指针时&#xff0c;经常需要把一个类型的指针转化为另一个类型的指针 ③与C语言兼容&#xff1a; C兼…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

【信息系统项目管理师知识点速记】进度管理:排列活动顺序

10.5 排列活动顺序 排列活动顺序是识别和记录项目活动之间关系的过程,主要作用是定义工作之间的逻辑顺序,以在既定的所有项目制约因素下获得最高的效率。本过程需要在整个项目期间开展。 10.5.1 输入 项目管理计划: 进度管理计划:规定了排列活动顺序的方法、准确度和其他…

数据结构:图

数据结构&#xff1a;图 前言 在自动化程序分析中&#xff0c;图和树的一些算法起到了至关重要的作用&#xff0c;所以在开始自动化程序分析的研究前&#xff0c;我用了两天复习了一遍数据结构中的图。本章主要内容有图的基本概念&#xff0c;图的存储和图相关的经典算法&…