Kafka 保证消息消费全局顺序性

news2024/11/28 10:42:45

当有消息被生产出来的时候,如果没有指定分区或者指定 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.coloradmin.cn/o/1266718.html

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

相关文章

【预测爆款不用愁,有服饰RFID小助手】

时尚服饰行业库存成本高,数据不精准,爆款服饰一直抓不住,增加库存滞销风险难脱逃,给服饰零售企业带来极大困扰。 帮您提前预测爆款服饰小塔服饰RFID系统 小塔RFID系统作为服饰新零售小助手,通过RFID系统与硬件结合&a…

Vue3 Teleport

假设情景 以下面截图为例,A组件中可以操控数字的加减,想把这个功能放到B组件中使用,AB两个组件非父子组件,甚至可能被嵌套了其他组件,一般办法可能是将A组件数据传给AB组件的父组件,然后在相办法给B&#…

贝叶斯Sklearn实践

贝叶斯统计学是一种基于贝叶斯定理的概率推理方法,它提供了一种对概率进行建模和更新的框架。贝叶斯方法在机器学习中得到了广泛的应用,特别是在分类问题中,如垃圾邮件过滤、文本分类等。与传统的频率主义方法相比,贝叶斯方法具有…

【PyQt】QPixmap与numpy.array互转

这里给出QPixmap→numpy.ndarray的两条转换(一个是使用PIL.Image而另一个不用), 以及numpy.ndarray→QPixmap两条转换(同样也是用不用PIL.Image的区别)。 代码运行结果: from PyQt5.QtCore import QPoint,QRect,Qt from PyQt5.QtWidgets import QLabel …

如何拥有免费的docker镜像仓库

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 hello,伙伴们,最近在研究devops的事情,发现了很有意思的东西。 就是我们所有…

springboot整合redis+自定义注解+反射+aop实现分布式锁

1.定义注解 import java.lang.annotation.*; import java.util.concurrent.TimeUnit;/** Author: best_liu* Description:* Date: 16:13 2023/9/4* Param * return **/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Documented public interface RedisLo…

怎么把dwg格式转换pdf?

怎么把dwg格式转换pdf?DWG是一种由AutoCAD开发的二维和三维计算机辅助设计(CAD)文件格式,它的名称是“绘图(Drawing)”的缩写。DWG文件通常包含了设计图纸、模型和元数据等信息,并且被广泛用于工…

工艺系统所管理数字化实践

摘要 本文介绍了上海核工程设计研究院在数字化转型方面的实践,包括业务数字化和管理数字化两个方面。业务数字化方面,该院通过开发小工具改进工作流程。管理数字化方面,该院采用零代码平台集中管理管道力学信息相关模型和数据,并…

Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?(2)| IDCF

作者:Martin Fowler 译者:冬哥 原文:https://martinfowler.com/articles/remote-or-co-located.html (接上篇 ) 二、大多数人在同地办公时工作效率更高 与软件开发中的许多主题一样,我不能拿 100 个软…

Sectigo通配符证书

Sectigo通配符证书(Wildcard SSL Certificate)是一种特殊类型的SSL证书,它适用于一个主域名及其所有子域名。这意味着,只要子域名在主域名下,就可以使用同一张通配符证书进行加密保护。这为拥有多个子域名的网站提供了…

探究Kafka原理-7.exactly once semantics 和 性能测试

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请&#x1f44…

方差分析汇总

一文整理了方差分析的全部内容,包括方差分析的定义(基本思想、检验统计量的计算、前提条件)、方差分析分类(单因素、双因素、多因素、事后多重比较、协方差分析、重复测量方差分析)、方差分析流程(数据格式…

四川天蝶电子商务有限公司真实可靠吗?

随着数字经济的不断发展,抖音电商服务日益成为企业拓展销售渠道、提升品牌影响力的关键一环。在这样的大背景下,四川天蝶电子商务有限公司凭借其专业的服务能力和创新的技术手段,迅速崛起为抖音电商服务领域的领军企业。 四川天蝶电子商务有限…

使用 ZFPlayer 播放视频的注意点

一 静音功能 通过调用系统的AVPlayer.muted来实现的 - (void)setMuted:(BOOL)muted {_muted muted;self.player.muted muted;if (self.audioMuteChange) {self.audioMuteChange(self, muted);}... }播放进度条 /// 滑杆 property (nonatomic, strong, readonly) ZFSliderV…

04、基于高斯分布的异常检测算法

04、基于高斯分布的异常检测算法原理与实践 开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣,作为入门的素材非常合适。 数据的严重偏斜往往会导致监督学习算法面临巨大的挑战——…

亚马逊云科技 re:Invent 2023:引领科技前沿,探索未来云计算之窗

文章目录 一、前言二、什么是亚马逊云科技 re:Invent?三、亚马逊云科技 re:Invent 2023 将于何时何地举行四、亚马逊云科技 re:Invent 2023 有什么内容?4.1 亚马逊云科技 re:Invent 2023 主题演讲4.2 亚马逊云科技行业专家探实战 五、更多亚马逊云科技活…

发牌洗牌的简单逻辑

1. 需求分析 1.1 要求实现: 我们能使用一副牌,基本的实现多人炸金花小游戏。 1.2 实现分析: 1、有一副牌: 首先自定义card类,来定义每一张牌;(牌上由花色和数字(1~13)&…

第二十章多线程

线程简介 java语言提供了并发机制,程序员可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发运行。 一个进程是一个包含有自身地址的程序,每个独立执行的程序都称为进程。也就是说每个正在执行的程序都是一个进…

基于QT的俄罗斯方块游戏设计与实现

基于QT的俄罗斯方块游戏设计与实现 摘要:信息时代正处于高速发展中,而电子游戏已经成为人生活中或不可少的消磨工具之一。科技时代在不断地高速发展中,游戏相关编程设计也随着发展变得越来越重要, 俄罗斯方块游戏是一款古老传遍世…