Kafka 保证消息消费全局顺序性
当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配

我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一个或多个分区

如果一个消费者消费了多个分区,某些场景下消费者需要顺序地消费消息,但消息并不是按照顺序分配给分区的,所以就不一定能够保证消息消费的全局顺序性
比如下图中 Msg0002 消息并不是在 Msg0001 消息之后的,就有可能导致消费者先把 Msg0002 消息给消费, Msg0001 消息才被消费

那么这种情况该怎么解决?如何尽可能地保证消息消费的全局顺序性?(即这些消息具有因果关系)要想消费消息 B 必须先消费消息 A
要注意的是,Kafka 的设计目标是提供高吞吐量和低延迟,而不是强制保证全局有序性
所以这篇文章探讨的是需要强调全局顺序性场景下的 Kafka 应用
单分区
最简单粗暴的方法,虽然 Kafka 不能保证全局消费顺序性,但是能够保证分区内的消息顺序性

所以我们可以只创建一个分区,并让消费者消费这个分区,这样就能够保证消费的消息是有序的
但是这样做大大降低了吞吐量和处理效率,容易使得性能出现瓶颈
基于 key
在 Kafka 中,基于 key 的消息分配策略是通过消息中的键(key)来确定消息发送到哪个分区
当生产者发送消息时,可以指定一个键(key),Kafka 使用这个键通过哈希算法来确定消息被发送到哪个分区

由于相同的 key 就发送到同一分区,这样就能够保证了消费的消息是有序的
然而,如果只有一个消费者消费相同 key 的消息,那么与单分区相比,基于 key 的消息分配策略不会提高吞吐量
因为即使相同 key 的消息在多个分区中,但同一消费者依然只能从一个分区中消费,这并不会增加整体的处理能力。
但如果有多个消费者消费相同 key 的消息,基于 key 的分区策略可以提高消费者并行消费的能力

因为这些消费者可以同时从不同分区中读取消息,从而增加整体的处理速度。这种情况下,基于 key 的消息分配可以提高整体吞吐量
最后总结一下:
-
Kafka 的设计目标是提供高吞吐量和低延迟,而不是强制保证全局有序性,所以Kafka使用多分区的概念,并且只保证单分区有序
-
如果想要实现消息的全局有序
-
单分区策略:
一个主题下只创建一个分区,一个消费者只消费一个分区,但这样做毫无并发性可言,极大降低系统性能
-
基于 key 的消息分配策略:
由于相同的 key 就发送到同一分区,这样就能够保证了消费的消息是有序的。然而,如果只有一个消费者消费相同 key 的消息,与前面单分区相比没有什么区别
-
相关文章:
Kafka 保证消息消费全局顺序性
当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一个或多…...
3分钟在CentOS 7上离线安装Docker
在CentOS 7上离线安装Docker的详细步骤如下: 环境检查和准备 检查内核版本:Docker要求系统为64位且内核版本至少为3.10。使用命令uname -r查看内核版本。 检查CentOS版本:通过命令cat /etc/redhat-release查看版本信息。 更新yum包࿰…...
GaussDB数据库SQL系列-触发器
目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附:表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器,以便在插入新记录时自动将记录的创建…...
网工学习10-IP地址
一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示,中间用…...
二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空
一、目的 在HiveSQL的DWD层中,需要对原始数据进行去重在内的清洗,结果一开始其他数据类型的清洗工作都正常,直到碰到转向比数据。 一般的SQL查询有数据,但是加上group by以后就没数据; 一般的SQL查询有数据…...
Docker—共享应用程序
现在您已经构建了一个映像,可以共享它。要共享Docker映像,您必须使用Docker注册表。默认注册表是Docker Hub,是您使用的所有图像的来源。 Docker ID(Docker标识) Docker ID允许您访问Docker Hub,这是世界上…...
Linux横向移动
Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…...
Ubuntu 20.0 + mysql 8.0 用户和密码修改
第一步 下载(简单,注意联网)Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …...
看懂lscpu的输出
文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …...
RoPE旋转位置编码浅析
RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…...
在 SQL Server 中备份和恢复数据库的最佳方法
在SQL Server中,创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述: 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…...
Java8 根据自定义属性去重
一、需求背景 有一个List集合,里面有n个Answer成员,成员种有m个属性,即: List<Answer> answers ...,现在我需要根据Answer的某一个属性对List去重(属性不固定),应该如何实现呢? 二、解决办法 需要满足上述需求,并不难,我们可以使用Java8提供的…...
Netty网络编程
入门案例 1、服务器端代码 public class HelloServer {public static void main(String[] args) {// 1、启动器,负责装配netty组件,启动服务器new ServerBootstrap()// 2、创建 NioEventLoopGroup,可以简单理解为 线程池 Selector.group(n…...
层三交换机解析(Layer 3 Switch)层3交换机
文章目录 层三交换机解析1. 概述1.1 什么是层三交换机1.2 层三交换机与路由器、二层交换机的比较 2. 层三交换机的工作原理2.1 基于MAC地址的转发2.2 基于IP地址的转发 3. 层三交换机的配置4. 常见问题与解答4.1 我应该使用路由器还是层三交换机?4.2 层三交换机可以…...
expect自动化交互
目录 1. expect作用: 2. expect语言用法: 3. 实例 1. expect作用: 是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题。 2. expect语言用法: spawn开启免…...
探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别
Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容:Web 2.0 时代以用户生成内容为特征,用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者,网络逐渐从被动浏览…...
c++基本常见错误总结
我们无论是在学习中还是在工作当中,总是会遇到各种各样的c编译错误问题,经常会有一种情况就是上一次好像遇到过这种问题,但是就是想不起来了(我就是这样)所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…...
鸿蒙原生应用/元服务开发-AGC分发如何生成密钥和和证书请求文件
HarmonyOS通过数字证书(.cer文件)和Profile文件(.p7b文件)等签名信息来保证应用的完整性,应用如需上架到华为应用市场必须通过签名校验。因此,开发者需要使用发布证书和Profile文件对应用进行签名后才能发布…...
Python自动化——driver.switch_to的用法
driver.switch_to的用法 from selenium import webdriver driver webdriver.Chrome(/path/to/chromedriver) # Chrome driver.get(https://www.example.com) # 打开网页 element driver.find_element_by_id(element_id) # 查找元素记得在不需要使用 driver 时,…...
【Java技术专题】「入门到精通系列教程」深入探索Java特性中泛型技术体系的原理和实战开发指南
深入探索Java特性中泛型技术体系的原理和实战开发指南 前提介绍泛型的介绍泛型带来的好处泛型引发的问题错觉:泛型也可以实现多态 泛型的特点类型擦除概念定义案例分析隐患问题开发要点类型擦除的过程案例代码 实例分析类型转换问题 通配符与上下界通配符List<Ob…...
基于STC89C52的智能避障循迹小车优化与扩展功能实现
1. STC89C52智能小车基础功能实现 刚接触单片机开发时,用STC89C52做智能小车是最经典的练手项目。这个51内核的单片机虽然性能比不上现在的STM32,但胜在价格便宜、资料丰富,特别适合初学者。我当年做的第一辆小车就是基于这个方案,…...
从碳排放到城市健康:土地利用强度如何成为评估可持续发展的新标尺?
从碳排放到城市健康:土地利用强度如何成为评估可持续发展的新标尺? 当我们在讨论城市可持续发展时,碳排放往往是最受关注的指标。但一个更本质的问题却被忽视了:我们脚下的土地,究竟在以怎样的方式支撑或制约着城市的未…...
scrcpy高级玩法:教你用Windows批处理脚本定制手机投屏模式(低延迟/高画质/纯音频)
scrcpy高级定制:Windows批处理脚本实现专业级手机投屏方案 手机投屏已经成为现代工作流中不可或缺的一环,无论是游戏直播、远程演示还是多媒体播放,都需要针对不同场景优化投屏参数。scrcpy作为开源神器,配合Windows批处理脚本&a…...
网盘直链解析工具:八大平台下载加速的完整解决方案
网盘直链解析工具:八大平台下载加速的完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
Grafana告警邮件模板定制实战:从基础配置到高级优化
1. Grafana告警邮件模板基础配置 第一次接触Grafana告警邮件模板时,我被它强大的自定义能力所震撼。记得去年给客户部署监控系统时,他们提出一个很实际的需求:告警邮件必须包含服务器名称、具体告警事项和当前指标值这三要素。当时用默认模板…...
GLM-4-9B-Chat-1M效果实测:1M上下文下跨500页文档的因果推理与事实核查
GLM-4-9B-Chat-1M效果实测:1M上下文下跨500页文档的因果推理与事实核查 1. 引言:当AI遇上超长文本 想象一下,你面前放着500页的文档资料,需要从中找出特定信息、分析因果关系、验证事实准确性。这对人类来说都是个艰巨任务&…...
ClaudeCode安装与使用
前言:null 一、前期准备 在开始之前,请确保你已经具备以下条件: 有 git 的环境。 有安装 Node.js(不是必须,但推荐安装以防默认安装失败,建议使用最新稳定版本)。 可以访问外网(…...
探店无数,平凉这口五仁月饼最难忘
我是浙江人,在广州工作。品质出众次听说五仁月饼是在一个平凉同事嘴里。他形容了半天"外头酥里头软"、"麦香特别浓"、"能撕着吃",我完全想象不出来——一个饼子能有多特别?直到他寄了一盒给我。探店无数&#…...
Android Camera2 + OpenGL 竖屏或横屏预览会有“轻微拉伸”
前言在进行 Android 相机底层开发(Camera2 OpenGL ES)时,开发者经常会遇到各种拉伸问题。有一种最隐蔽的“轻微拉伸”:画面方向正确,预览也没变黑,但人脸看起来明显比平时“瘦长”了一点点。本文将结合一次…...
ESXI里面虚拟机服务器始终保持免用户认证状态
最近安装了几个虚拟机,给第三方远程安装环境。打开虚拟机安装完,向日葵的时候,关闭控制台,虚拟机就自动注销用户关闭了,需要重新登录控制台。同事...
