【kafka面试题2】如何保证kafka消息的顺序性

【kafka面试题】如何保证kafka消息的顺序性

一、整体策略

如何保证kafka消息的顺序性呢,其实整体的策略就是:我们让需要有序的消息发送到同一个分区Partition。
为什么说让有序的消息发送到同一个分区Partition就行呢,,下面我们来详细分析一下子。

二、分析

首先,我们知道kafka消息的收发是基于Topic(主题),消息通过Topic进行分类。单个Topic可以有多个Partition(分区,可以理解为一个队列),消息以追加的方式写入分区(Partition),然后以先入先出的方式读取。需要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。同时,单个Partition在同一个消费者组内,只能被一个消费者消费。

所以基于上述kafka的特性,要保证kafka消息的顺序性,我们只要让需要有序的消息发送到同一个分区就行。
那么,kafka生产者如何将消息发送到同一个分区呢,这就涉及到了另一个问题kafka生产者的分区选择策略

三、kafka生产者的分区选择策略

Kafka生产者的分区选择策略是指在将消息发送到Kafka集群时,生产者决定将消息发送到哪个分区(Partition)。kafka分区选择策略如下:
1、指定了分区
当发送时指定了partition就使用该partition。即kafka生产者发送的消息ProducerRecord(String topic, Integer partition, K key, V value)指定了发送到哪个具体的分区。
在这里插入图片描述

2、通过默认分区器(partitioner)实现指定分区
如果kafka生产者发送的消息ProducerRecord(String topic, Integer partition, K key, V value)没有指定发送到哪个具体的分区,即partition=null(并且key也为空时,如果此时key不为空的话就会采用另一种分区策略key哈希分区策略,这个咱在第四条给你讲,别急!!!),并且使用了默认的分区器,那么消息将被随机的发送到主题的各个可用分区上,分区器使用轮询的算法将消息均衡的分布到各个分区。
在这里插入图片描述

3、自定义分区策略(即自定义Partitioner)
用户可以根据自己的需求实现自定义的分区策略,通过实现org.apache.kafka.clients.producer.Partitioner接口来自定义分区选择逻辑。
在这里插入图片描述

4、key哈希分区策略
根据消息的key进行哈希计算,并将消息发送到对应的分区。保证相同key的消息始终被发送到同一个分区,确保消息的顺序性。
在这里插入图片描述

综上所述,如果要保证kafka生产者发送的消息(局部)顺序性,我们就可以将需要保证顺序性的kafka消息发送到同一个分区,而如何将kafka消息发送到同一个分区呢,我们就可以使用上述第四种分区选择策略,即key哈希分区策略,我们可以使用Id或者能标记记录的标识作为key,这样key相同的消息就会呗分发到同一个分区进行消费,即保证了kafka消息的顺序性。

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

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

相关文章

Python学习笔记(十六)————异常相关

目录 (1)异常概念 (2)异常的捕获 ①异常捕获的原因 ②捕获常规异常 ③捕获指定异常 ④捕获多个异常 ⑤ 捕获异常并输出描述信息 ⑥捕获所有异常 ⑦异常else ⑧异常的finally (3)异常的传递 &#xff08…

Idea社区版创建SpringBoot

一 下载Spring Initalizr and Assistant插件 选择左上角的File->Settings->Plugins,在搜索框中输入Spring,出现的第一个Spring Boot Helper插件,点击Installed,下载插件。(这里已经下载) 二 创建Spr…

【MySQL练习及单表查询】

一、MySQL练习 一.创建表: 创建员工表employee,字段如下: id(员工编号) name(员工名字) gender(员工性别) salary(员工薪资) 二.插入数据 1&…

【Windows】Redis单机部署

下载redis 下载地址:Releases microsoftarchive/redis GitHub 1、下载后解压,在文件根目录下创建两个文件夹dbcache、logs 修改配置文件redis.windows.conf (1)配置redis地址: bind 127.0.0.1 (2&am…

Redis常见数据结构

文章目录 前言一、Redis通用命令二、String类型三、Key的层级结构四、Hash类型五、List类型六、Set类型七、SortedSet类型 前言 Redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样 在学习Redis不同数据类型时,我们…

AIGC - Stable Diffusion 图像控制插件 ControlNet (OpenPose) 配置与使用

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131591887 论文:Adding Conditional Control to Text-to-Image Diffusion Models ControlNet 是神经网络结构,用于控制预…

Vision Pro销售策略曝光,面罩/头带/屈光镜片加大零售难度

彭博社Mark Gurman再次发布了关于苹果Vision Pro的销售策略,以及零售方面的难题。 一、销售计划和策略 1,2024年初先在美国部分门店销售,仅线下购买,线上暂不开放。购买方式是先线上预约(可能要提供面部扫描图、眼镜…

JMeter进行websocket测试

在做websocket性能测试的时候找了几个测试工具都暂时没有对websocket的支持,发现jmeter好像对websockect支持。但是使用jmeter时需要安装插件,下面一起看一下。 jmeter下载安装: 官网下载 https://jmeter.apache.org/download_jmeter.cgi 也…

spring-spring整合Junit

1.导包 <artifactId>spring-test</artifactId> <artifactId>junit</artifactId> 2.创建测试类

Server - 通过 AutoSSH 建立服务器端口转发用于访问网页

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131536508 AutoSSH 是一款用于创建和维护持久的SSH隧道的工具&#xff0c;可以自动检测和恢复断开的连接&#xff0c;从而保证隧道的稳定性。Auto…

20.光敏传感器

1.光敏传感器介绍&#xff1a; 光敏二极管(光敏电阻),作为光敏传感器&#xff1b;光敏二极管也称光电二极管&#xff1b;光敏二极管与半导体二极管在结构上类似&#xff0c;其管芯是一个具有光敏特征的PN结&#xff0c;具有单向导电性&#xff0c;因此工作时需要加上反向电压。…

Linux性能优化实践——如何学习Linux性能优化

性能指标 学习性能优化的第一步便是了解“性能指标”这个概念。 “高并发”和“响应快”对应着性能优化的两个核心指标——“吞吐”和“延时”。这两个指标是从应用负载的角度来考察性能的&#xff0c;直接影响了产品终端的用户体验。跟他们对应的&#xff0c;是从系统资源的视…