首页 > 其他分享 >Kafka 如何保证消息消费的全局顺序性

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

时间:2023-11-27 19:25:23浏览次数:33  
标签:顺序 分区 Kafka 消费 消息 key 全局

哈喽大家好,我是咸鱼

今天我们继续来讲一讲 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,全局
From: https://www.cnblogs.com/edisonfish/p/17860198.html

相关文章

  • 记录一下vue如果全局引入scss变量
    开始首先一些普通的css,可以在App.vue中引入然后项目中会经常用到一些功能型的scss,比如mixin,和函数等,这个时候在main.js和app.vue是无效的。首先查看自己的sass和sass-loader版本,注意sass-loader的安装版本,如果是v8的版本使用prependDatea,以上的版本使用additionalData(翻......
  • Kafka3.6.0 linux 安装,非zookeeper模式
    参考:安装Kafka3.3.1及kraft运行,告别zookeeper_kafka3.3.1jdk无需zookeeper,kafka3.0版本集群安装实战 操作系统:ubutun18.04LTS1.下载到kafka官网下载2.上传到服务器指定位置3.解压到指定目录,这里我放到/opt下tar-xzvfkafka_2.13-3.6.0.tgz-C/opt/4.修改配置:因为......
  • 性能测试复习准备——linux环境下安装kafka_2.13-3.2.3.tgz
    参考:https://www.bilibili.com/video/BV1Xy4y1G7zA?p=6&vd_source=79bbd5b76bfd74c2ef1501653cee29d6      解压到目录路径下:  启动kafka之前,首先启动zk:       修改配置文件:        启动kafka和查看:       ......
  • kafka入门(二): 位移提交
    位移提交:Kafka的每条消息都有唯一的offset,用来表示消息在分区中对应的位置。有的也称之为"偏移量"。消费者每次在poll()拉取消息,它要返回的是还没有消费过的消息集,因此,需要记录上一次消费时的消费位移,并且持久化。消费者在消费完消息之后,需要执行消费位移的提交。自动位......
  • Kafka生产和消费
    生产,私有topic:[root@gbxhfbin]#exportPATH=$PATH:/data/kafka_2.12-2.8.2/bin;cd/data/kafka_2.12-2.8.2/bin[root@gbxhfbin]#kafka-console-producer.sh--bootstrap-server192.168.1.200:8423,192.168.1.201:8423--topic"RDSP-IPCM-NOTICE"--producer.c......
  • C语言编程技巧 全局变量在多个c文件中公用的方法
    在使用C语言编写程序时,经常会遇到这样的情况:我们希望在头文件中定义一个全局变量,并将其包含在两个不同的C文件中,以便这个全局变量可以在这两个文件中共享。举个例子,假设项目文件夹"project"下有三个文件:main.c、common.c和common.h。在这种情况下,我们希望声明一个字符型变量"key",......
  • Introducing the kafka producer
    IntroductionAswesawintheprevioussections,Ithinkwehavesomebasicinformationaboutthekafkaproducers,today,letmediginthisconcept. Kafkaproducersaregoingtowritedatatotopicsaremadeofpartitions,nowtheproducersinkafkawil......
  • Linux下利用Docker快速部署Kafka
    1.摘要Kafka是由Apache软件基金会开发一个开源流处理平台,使用Scala和Java编写,该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个按照分布式事务日志架构的大规模发布/订阅消息队列。这种工作方式使它为企业级基础设施来处理流失数据非常......
  • 全网最全图解Kafka适用场景
    消息系统消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。根据经验,通常消息传递对吞吐量要求较低,但可能要求较低的端到端延迟,并经常依赖kafka可靠......
  • 全网最全图解Kafka适用场景
    消息系统消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处理大规模的消息。根据经验,通常消息传递对吞吐量要求较低,但可能要求较低的端到端延迟,并经常依赖kafka可靠的......