使用消息队列遇到的问题—kafka

目录

  • 1 分区
  • 2 消费者
  • 3 Kafka 如何保证消息的消费顺序?
    • 3.1 方案一
    • 3.2 方案二
  • 4 消息积压

在项目中使用kafka作为消息队列,核心工作是创建生产者—包装数据;创建消费者----包装数据。
欠缺一些思考,特此梳理项目中使用kafka遇到的一些问题和解决方案

1 分区

参考博文:点击链接

分区:主题可以被分为若干个分区(partition),同一个主题中的分区可以不在一个机器上,有可能会部署在多个机器上,由此来实现 kafka 的伸缩性,单一主题中的分区有序,但是无法保证主题中所有的分区有序

示例:假设有一个主题(Topic)A,有三个分区(Partition 0、Partition 1、Partition 2)。如果生产者产生了5条消息,该如何分配?

这就涉及到了kafka的分区机制了

kafka 的分区策略指的就是将生产者发送到哪个分区的算法。Kafka 为我们提供了默认的分区策略,同时它也支持你自定义分区策略。

分区策略有

  • 顺序轮询 (下面示例介绍)
  • 随机轮询

在这里插入图片描述

Kafka中消息的分配到分区的过程是由分区器(Partitioner)来负责的。默认情况下,Kafka使用的是轮询分区策略,也就是说,生产者产生的消息会依次被分配到不同的分区,以此循环。

假设有一个主题(Topic)A,有三个分区(Partition 0、Partition 1、Partition 2)。如果生产者产生了5条消息,这些消息会被轮询地分配到这三个分区中,直到所有消息都被发送。分配的过程如下:

第1条消息分配到 Partition 0
第2条消息分配到 Partition 1
第3条消息分配到 Partition 2
第4条消息再次分配到 Partition 0
第5条消息再次分配到 Partition 1

这样的分配方式保证了各个分区的负载均衡。总体而言,如果有足够的消息量,这些消息会在各个分区之间均匀分布,从而实现了平均分配的效果。

需要注意的是,分区策略是可以配置的,你可以自定义分区器来实现不同的分配策略,但默认情况下,轮询分区是常见的方式。

在这里插入图片描述

2 消费者

消费组: 消费数据的时候,都必须指定一个group id,指定一个组的id假定程序A和程序B指定的group id号一样,那么两个程序就属于同一个消费组。
特殊: 比如,有一个主题topicA程序A去消费了这个topicA,那么程序B就不能再去消费topicA(程序A和程序B属于一个消费组);再比如程序A已经消费了topicA里面的数据,现在还是重新再次消费topicA的数据,是不可以的,但是重新指定一个group id号以后,可以消费。不同消费组之间没有影响,消费组需自定义,消费者名称程序自动生成(独一无二)。

此时有两个消费者,三个分区,该如何分配呢?
在这里插入图片描述

在 Kafka 中,一个消费者组(Consumer Group)可以由多个消费者组成。当消费者组订阅一个主题(Topic)时,Kafka 会自动将主题的分区分配给消费者组中的消费者。

对于一个消费者组中的多个消费者,它们不需要手动指定分区。Kafka 使用一种分区分配策略来确保每个分区只被一个消费者消费。默认情况下,Kafka 使用的是范围分配(Range Assignment)策略。

在范围分配策略下,每个消费者被分配一定范围的分区。例如,有一个主题有三个分区(Partition 0、Partition 1、Partition 2),消费者组中有两个消费者(Consumer A 和 Consumer B),分配可能如下:

Consumer A 被分配 Partition 0 和 Partition 1
Consumer B 被分配 Partition 2
这种自动的分区分配机制使得消费者组能够 并行 地处理消息,提高整体的消费吞吐量。

需要注意的是,如果消费者组中的消费者数量发生变化,分区的分配会动态调整以适应新的消费者数量,而无需手动干预。 Kafka会在有新的消费者加入或者有消费者退出时自动重新平衡分区。这种自动的分区调整机制是 Kafka 提供的一项强大的功能,能够使得整个系统更加灵活和容错。

3 Kafka 如何保证消息的消费顺序?

消费后会提交偏移量
在这里插入图片描述

示例:生产者提供了5条消息,暂且按照上述方式分配消息。当消费者组 消费的时候会出现这种情况

0:01时刻 :张三消费c(并提交offset) 李四消费b(并提交offset)
重新动态匹配 消费者和分区,这里暂且忽略
0:02时刻 :张三消费a(并提交offset) 李四消费e(并提交offset)

此时消费的顺序是 c,b---->a,e
期待的消费顺序是a–>b—>c—>d---->e

因此是乱序的,需要重新设计方案解决

3.1 方案一

若是只有一个分区,这样就可以保证消费顺序了:a–>b—>c—>d---->e

在这里插入图片描述

3.2 方案二

指定消息全存在某一个分区

如何指定: Kafka 中发送 1 条消息的时候,可以指定 topic, partition, key,data(数据) 4 个参数。如果你发送消息的时候指定了 Partition 的话,所有消息都会被发送到指定的 Partition。并且,同一个 key 的消息可以保证只发送到同一个 partition,这个我们可以采用表/对象的 id 来作为 key 。

  • Topic: 指定消息要发送到的主题。
  • Partition: 指定消息要发送到的分区。如果指定了分区,那么所有的消息都会被发送到这个分区。
  • Key: 通常用于确定消息应该被发送到哪个分区。如果你使用相同的 key,Kafka 会根据 key 使用分区器(Partitioner)将具有相同 key 的- 消息发送到同一个分区。
  • Value: 实际的消息内容。

Key是用于计算消息应该被分配到哪个分区的依据,而Partition是直接指定分区

4 消息积压

4.1 方案一

场景描述:

  • Kafka 主题:orders,2个分区
  • 初始状态:有一个消费者组(Consumer Group)中有一个消费者实例(Consumer Instance)用于处理订单消息。
  • 积压情况:由于订单数量激增,导致 orders 主题中的消息积压。
  1. 增加消费者

以前消息被分发到2个分区,但是只有一个消费者消费其中一个分区,另外一个暂时搁置,多创建一个消费者,提高使用率。
这里有个细节,项目执行后,唯一的线程:main线程---->消费分区1,无法做到同时控制另外一个消费者去消费分区2。看似消费者多了,实际效率没变化。只能增加线程

  1. 增加线程

一个消费者占一个线程,这样项目启动,2个线程控制2个消费者,kafka负载均衡自动分配(一个消费者消费一个分区),提高了效率

  1. 异步消费 (并不能处理消息积压)

在系统中,主线程调用 某个方法后,这个方法先返回数据给主,主继续执行自己的逻辑。而这个方法是异步的,所以他可以在后台创建线程和消费者,不会造成系统阻塞。

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

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

相关文章

浅析以太网接口及串口转以太网技术

浅析以太网接口 以太网相关接口主要包括:MII/RMII/SMII以及GMII/RGMII/SGMII接口。 一、MII接口 MII(Media Independent Interface)介质无关接口或称为媒体独立接口,它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口和…

卷积详解和并行卷积

ps:在 TensorFlow Keras 中,构建 Sequential 模型的正确方式是将层作为列表传递,而不是作为一系列单独的参数。 modelmodels.Sequential([layers,layers]) 而不是modelmodels.Sequential(layers,layers) 文章目录 卷积…

Redis 基础—Redis Desktop Manager(Redis可视化工具)安装及使用教程

Redis Desktop Manager 是一个可视化的 Redis 数据库管理工具,可以方便地查看和操作 Redis 数据库。使用 Redis Desktop Manager 可以大大提高 Redis 数据库的管理效率。 RDM的安装和配置 首先,您需要下载和安装Redis Desktop Manager。 安装完成后&am…

Python 小红书评论区采集 小红薯xhs精准用户获客

成品图 评论接口https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id笔记id&cursor光标 初次使用cursor为空,该接口为GET,需要x-s,x-t签名验证 子评论接口https://edith.xiaohongshu.com/api/sns/web/v2/comment/sub/page?note_id%s&r…

python爬取robomaster论坛文章数据,携带登录信息

一. 内容简介 python爬取robomaster论坛文章数据。 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 三.主要流程 3.1 接口分析,以及网页结构分析 # 这是文章链接,其实id就是文章的id # https://bbs.robomaster.com/forum.php?modview…

win系统一台电脑安装两个不同版本的mysql教程

文章目录 1.mysql下载zip包(地址)2.解压在你的电脑上(不要再C盘和带中文的路径)3.创建my.ini文件4.更改环境变量(方便使用, 可选)5.打包mysql服务6.初始化mysql的data7.启动刚刚打包的服务8.更改密码 1.mys…

CentOS常用基础命令大全(linux命令)2

CentOS常用基础命令大全(linux命令) 1.关机 (系统的关机、重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 sh…

【无标将列表中的多组参数依次带入指定的函数将每次调用函数返回结果组成列表itertools.starmap()题】

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将列表中的多组参数 依次带入指定的函数 将每次调用函数 返回结果组成列表 itertools.starmap() [太阳]选择题 请问以下代码输出的结果是? import itertools a [(1, 2), (3, 4)] p…

基于JAVA+SpringBoot+Vue的前后端分离的医院信息智能化HIS系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着科技的不断发展&a…

解决Ubuntu16.04没声音

第一步:安装 PulseAudio Volum Control Ubuntu没有声音(听不到声音)的解决方法 第二步:No cards available for configuration 【解决Ubuntu18.04没声音:No cards available for configuration】 完美解决&#xf…

【WPF.NET开发】WPF中的对话框

目录 1、消息框 2、通用对话框 3、自定义对话框 实现对话框 4、打开对话框的 UI 元素 4.1 菜单项 4.2 按钮 5、返回结果 5.1 模式对话框 5.2 处理响应 5.3 非模式对话框 Windows Presentation Foundation (WPF) 为你提供了自行设计对话框的方法。 对话框是窗口&…

浙政钉SDK安装

专有订单SDK&#xff08;jar包&#xff09;下载 专有钉钉门户 (dg-work.cn) Maven依赖 浙政钉 <!-- 浙政钉 --> <dependency><groupId>com.oracel</groupId><artifactId>zwdd-sdk-java</artifactId><version>1.2.0</version…

概率密度函数(PDF)正态分布

概率密度函数&#xff08;PDF&#xff09;是一个描述连续随机变量取特定值的相对可能性的函数。对于正态分布的情况&#xff0c;其PDF有一个特定的形式&#xff0c;这个形式中包括了一个常数乘以一个指数函数&#xff0c;它假设误差项服从均值为0的正态分布&#xff1a; p ( …

外汇天眼:新西兰监管机构永久性停止对David McEwen及与其相关的实体的命令

新西兰金融市场管理局&#xff08;FMA&#xff09;已对David Elgar McEwen及与其相关的实体&#xff08;McEwen and Associates&#xff09;发布了永久性停止令。 与McEwen先生相关的实体包括Stockfox Limited、Cosmopolitan Holdings Limited、Strategy Services Limited、Fun…

Ubuntu系统使用快速入门实践(七)——软件安装与使用(3)

Ubuntu系统使用快速入门实践系列文章 下面是Ubuntu系统使用系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 Ubuntu系统使用快速入门实践系列文章总链接 下面是专栏地址&#xff1a; Ubuntu系统使用快速入门实践系列文章专栏 文章目录 Ubuntu系统使用快速…

在uniapp中,可以使用那些预定义的样式类

u-flex&#xff1a;设置元素为弹性布局。u-flex-v&#xff1a;设置元素为纵向弹性布局。u-flex-h&#xff1a;设置元素为横向弹性布局。u-p-10&#xff1a;设置元素的上下左右边距为10rpx。u-p-t-10&#xff1a;设置元素的上边距为10rpx。u-p-b-10&#xff1a;设置元素的下边距…

教育心得整理

压抑使人反抗&#xff0c;反抗就是报复&#xff0c;报复就会引起犯罪。要消灭犯罪&#xff0c;我们必须杜绝引起孩子报复心理的行为&#xff0c;更重要的是&#xff0c;我们一定要对孩子表现出来爱与尊重 限制批评的次数限制每次批评的范围限制每次批评的强度 当彼此的信任和…

第一百九十五回 连接蓝牙设备的细节

文章目录 1. 概念介绍2. 实现方法2.1 示例代码2.2 知识回顾2.3 实现方法3. 示例代码我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容,本章回中将介绍SliverList组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中…

机器学习之无监督学习:九大聚类算法

今天&#xff0c;和大家分享一下机器学习之无监督学习中的常见的聚类方法。 今天&#xff0c;和大家分享一下机器学习之无监督学习中的常见的聚类方法。 在无监督学习中&#xff0c;我们的数据并不带有任何标签&#xff0c;因此在无监督学习中要做的就是将这一系列无标签的数…

Spring Cloud Gateway中对admin端点进行认证

前言 我们被扫了一个漏洞&#xff0c;SpringBoot Actuator 未授权访问&#xff0c;漏洞描述是这样的&#xff1a; Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块&#xff0c;借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计…