Kafka 如何保证消息消费的全局顺序性

哈喽大家好,我是咸鱼

今天我们继续来讲一讲 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 的消息,与前面单分区相比没有什么区别

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

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

相关文章

动态:class和:style绑定

1. 在应用界面中, 某个(些)元素的样式是变化的 class/style绑定就是专门用来实现动态样式效果的技术 2. 动态class绑定 :class等号后的变量值 可以是字符串 :class等号后 可以是对象 :class等号后 可以是数组 3. 动态style绑定 :style"{ color: myPinkColor, fontS…

医疗级超声波雾化器方案

药用雾化器是一种将药物液体转化为微小颗粒状物质并通过呼吸道输送到呼吸系统的医疗器械。常用于治疗呼吸道疾病,如哮喘、气管炎、肺炎、鼻窦炎等。且被广泛应用于医疗、美容、家居等领域。现代化的药用雾化器通常采用单片机方案控制,能够更加稳定地实现…

【软件测试】银行测试项目VS常规项目有什么区别?怎么做?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 银行测试项目跟常…

ESP32-Web-Server编程- JS 基础5

ESP32-Web-Server编程- JS 基础5 概述 JS 编程内容颇多,我们提供一些简单的示例,先玩再学,边玩边学。 示例1-演示通过 JS 进行温度转换 资源链接 对应示例的 code 链接 (点击直达代码仓库) 示例2-增加网页弹窗 演…

文献速递:使用人工智能进行超声检查的文章:读者指南(超声影像人工智能专题文献分享)

文献速递:使用人工智能进行超声检查的文章:读者指南(超声影像人工智能专题文献分享) 01 文献速递介绍 本文讨论了人工智能(AI)如何将医学影像转化为可挖掘的高通量数据,并强调了机器学习算法…

【攻防世界-misc】reverseMe

1.下载后,得到这样一张图片 2.利用在线翻转网站获取值,在线旋转图片工具|在线翻转照片|调整照片方向|生成镜像图片 - 改图宝 反转后的图片,将值提取并上传。

Java零基础——Nginx篇

1.【熟悉】服务器概述 1.1 目前常见的web服务器 1,Apache(http://httpd.apache.org) 它是世界上用的最多的web服务器,市场占有率达60%左右,模块非常丰富,系统非常稳定,可移植性好,但是比较消耗资源 2&…

数据采集静态存储SRAM芯片EMI7064

数据采集是利用一种装置,从系统外部采集数据并输入到系统内部的一个接口。数据采集技术广泛应用在各个领域。比如摄像头,麦克风,都是数据采集工具。 ram工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。RAM在计算…

开源与闭源:技术创新的两难选择

在当前数字化时代,技术界一直存在着关于开源与闭源软件的激烈辩论。最近,特斯拉CEO马斯克的公开表示引发了广泛的关注,他认为OpenAI不应该闭源,并宣布将首款聊天机器人开源。这一决定再次引发了人们对于开源与闭源的讨论。 开源的…

Rust之构建命令行程序(一):接受命令行参数

开发环境 Windows 10Rust 1.73.0 VS Code 1.84.2 项目工程 这次创建了新的工程minigrep. IO工程:构建命令行程序 这一章回顾了到目前为止你所学的许多技能,并探索了一些更标准的库特性。我们将构建一个与文件和命令行输入/输出交互的命令行工具&#…

openssl版本号解析

https://www.openssl.org/docs/man1.1.1/man3/OPENSSL_VERSION_NUMBER.html #define OPENSSL_VERSION_NUMBER 0xnnnnnnnnnL 从上面文章中可以看得出版本号共9位数(最后的L表示长整型) 如 0x101010ef 省略了前面的一个0, 实际为 0x0101010ef 版本是 1.…

Pangolin报错

【Error】error: ‘decay_t’ is not a member of ‘std’; did you mean ‘decay’? 解决办法 CMakeLists指定c版本为c14以上 set( CMAKE_CXX_FLAGS "-stdc14" )gcc版本高于4.9以上

业务流程图用什么软件绘制?

在企业的日常工作中,对于业务流程的把控和优化显得非常重要。为了更好地理解和管理业务流程,业务流程图便应运而生。 业务流程图是企业管理的图形化工具,它描述了企业在生产和服务提供过程中,在各个环节中所涉及的各种操作、任务…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事,为了偷懒,只能使出大招,毕竟自己不是那么老老实实干活的人,整理数据这类累和繁琐的活,我怎么能轻易动,好在gpt可以帮我来实现,有人可能会说,这么点内容你还不…

mac mini只有键盘怎么连接蓝牙鼠标

刚才遇到个问题,手头只有一个键盘和一个蓝牙鼠标,但是最新版本的系统对默认的纯键盘控制不太友好,得自己试出怎么连接,这里把如何在mac mini上用一个键盘连接上蓝牙鼠标,手上这台mini系统版本是14.0,有需要…

Lua判断字符串包含另一个字符串

string.find(“原字符串”,“目标字符串”) 返回这个子串的起始索引和结束索引,否则就会返回nil local index sting.find("ABCD",AB) --结果 1 2 if(index ~ nil)return true endstring.match(“原字符串”,“目标字符串”) local result string.mat…

linux常见命令合集

layout: post # 使用的布局(不需要改) title: linux使用命令合集 # 标题 subtitle: linux常用命令 #副标题 date: 2023-11-20 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: true # 是否归档 …

Pytorch:torch.Generator()

PyTorch 通过 torch.Generator 类来操作随机数的生成 1. 默认的随机数生成器 import torch# 设置默认的随机数种子 torch.manual_seed(0)# 查看默认的随机数种子 torch.initial_seed()2. 指定 torch.Generator随机数生成器 g torch.Generator() torch.Generator 实例的方法…

OpenCvSharp从入门到实践-(05)通道

目录 1、拆分通道 1.1、实例1-拆分一副BGR图像的通道 1.2、实例2-拆分一副HSV图像的通道 2、合并通道 2.1 实例3-合并通道的顺序不同,图像的显示效果也不通 实例4-合格H通道图像、S通道图像、V通道图像 3、综合运用拆分通道和合并通道 2.2、实例5-只把H通道的…

C++ new / delete ,malloc / free 区别

一、概述 都可以⽤来在堆上分配和回收空间。new /delete 是操作符,malloc/free 是库函数。 二、执行new的过程 1、分配未初始化的内存空间(malloc) 2、使⽤对象的构造函数对空间进⾏初始 化,返回空间的⾸地址。 注意:如果在第…