kafka常见问题处理

1. 如何防⽌消息丢失

在生产者层面,我们有个ack参数确认机制

设置成-1,也就是副本全部同步了leader才发送ack,这样确保leader和副本挂掉只剩一个还能

保证消息不丢失

消费者:

把⾃动提交改成⼿动提交

2. 如何防⽌重复消费

在防⽌消息丢失的⽅案中,如果⽣产者发送完消息后,因为⽹络抖动,没有收到ack,但实际上broker已经收到了。此时⽣产者会进⾏重试,于是broker就会收到多条相同的消息,⽽造成消费者的重复消费。

怎么解决:

⽣产者关闭重试:会造成丢消息(不建议)
消费者解决⾮幂等性消费问题:
所谓的幂等性:多次访问的结果是⼀样的。对于rest的请求(get(幂等)、post(⾮幂
等)、put(幂等)、delete(幂等))
解决⽅案:
1.在数据库中创建联合主键,防⽌相同的主键 创建出多条记录

假设我们有一个电商平台,其中有一个订单系统,需要处理用户的订单。在这个业务场景下,我们可以使用联合主键来避免重复消费。

假设订单系统中的订单数据存储在数据库表中,表结构包含以下字段:订单ID、用户ID、商品ID、订单状态等。

订单系统通过消息队列将订单数据发送给其他系统进行处理,比如库存系统和物流系统。当订单系统发送一个订单消息给库存系统时,可能由于网络抖动或其他原因导致消息发送失败,此时订单系统会进行重试。

然而,由于某些原因(如网络延迟、重试机制设计等),重试过程中可能会导致重复发送相同的订单消息到库存系统。如果没有相应的方式来防止重复消费,库存系统可能会处理同一订单多次,导致库存错误或其他问题。

为了解决这个问题,我们可以在订单数据表中创建一个联合主键,由订单ID、用户ID和商品ID组成。这样,当订单系统接收到一个新订单时,首先检查数据库中是否已存在具有相同联合主键的记录。

如果存在重复记录,订单系统可以判断该订单消息已经被处理过,并选择跳过重复消息的处理。如果不存在重复记录,则将该订单数据插入数据库,并发送消息给库存系统进行处理。

通过使用联合主键,我们可以确保在订单系统中防止重复消费的问题。即使在订单系统进行重试时,库存系统只会处理首次收到的订单消息,避免了重复消费产生的问题

2.使⽤分布式锁,以业务id为锁。保证只有⼀条记录能够创建成功

假设我们有一个在线活动报名系统,用户可以通过该系统报名参加各种活动。在这个业务场景中,我们可以使用分布式锁来保证同一个用户只能成功报名一次活动。

假设活动报名系统中的报名记录存储在数据库表中,表结构包含以下字段:报名ID、用户ID、活动ID、报名状态等。

当用户尝试报名一个活动时,系统需要进行以下操作:

  1. 检查该用户是否已经报名了该活动。
  2. 如果用户已经报名了该活动,则返回相应的提示,阻止用户重复报名。
  3. 如果用户未报名该活动,则将报名信息插入数据库,并完成报名流程。

在这个场景下,我们可以使用分布式锁来保证同一个用户只能成功报名一次活动。以用户ID作为锁的key,当用户尝试报名活动时,先尝试获取该用户的锁。

如果获取到了锁,表示该用户尚未报名该活动,可以继续执行报名操作,并将用户ID作为锁的值存储在分布式锁中。

如果未能获取到锁,表示该用户已经报名了该活动,可以给用户返回相应的提示,阻止用户重复报名。

3. 如何做到消息的顺序消费

  • ⽣产者:保证消息按顺序消费,且消息不丢失——使⽤同步的发送,ack设置成⾮0的值。
  • 消费者:主题只能设置⼀个分区,消费组中只能有⼀个消费者

kafka的顺序消费使⽤场景不多,因为牺牲掉了性能,但是⽐如rocketmq在这⼀块有专⻔的功能已设计好。

 

4. 如何解决消息积压问题


4.1 消息积压问题的出现


消息的消费者的消费速度远赶不上⽣产者的⽣产消息的速度,导致kafka中有⼤量的数据没有被消费。随着没有被消费的数据堆积越多,消费者寻址的性能会越来越差,最后导致整个kafka对外提供的服务的性能很差,从⽽造成其他服务也访问速度变慢,造成服务雪崩。

4.2 消息积压的解决⽅案


在这个消费者中,使⽤多线程,充分利⽤机器的性能进⾏消费消息。
通过业务的架构设计,提升业务层⾯消费的性能。
创建多个消费组,多个消费者,部署到其他机器上,⼀起消费,提⾼消费者的消费速度
创建⼀个消费者,该消费者在kafka另建⼀个主题,配上多个分区,多个分区再配上多个
消费者。该消费者将poll下来的消息,不进⾏消费,直接转发到新建的主题上。此时,新
的主题的多个分区的多个消费者就开始⼀起消费了。——不常⽤

5. 实现延时队列的效果

5.1 应用场景

订单创建后,超过30分钟没有⽀付,则需要取消订单,这种场景可以通过延时队列来实现

5.2 具体方案

 kafka中创建创建相应的主题
消费者消费该主题的消息(轮询)
消费者消费消息时判断消息的创建时间和当前时间是否超过30分钟(前提是订单没⽀付)
如果是:去数据库中修改订单状态为已取消。
如果否:记录当前消息的offset,并不再继续消费之后的消息。等待1分钟后,再次向kafka拉取该offset及之后的消息,继续进⾏判断,以此反复。
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】平衡树引入

数据结构-平衡树 前置知识 二叉树二叉树的中序遍历 问题 维护一个数据结构,支持插入元素、删除元素、查询元素的排名、查询排名对应的元素、查询元素的前驱、查询元素的后继等。 BST(二叉搜索树) 作为一个基本无效(很容易卡掉…

【IC验证】perl脚本——分析前/后仿用例回归情况

目录 1 脚本名称 2 脚本使用说明 3 nocare_list文件示例 4 脚本执行方法 5 postsim_result.log文件示例 6 脚本代码 1 脚本名称 post_analysis 2 脚本使用说明 help:打印脚本说明信息 命令:post_analysis help 前/后仿结束后,首先填…

VoxPoser:使用语言模型进行机器人操作的可组合 3D 值图

语言是一种压缩媒介,人们通过它来提炼和传达他们对世界的知识和经验。大型语言模型(LLMs)已成为一种有前景的方法,通过将世界投影到语言空间中来捕捉这种抽象。虽然这些模型被认为在文本形式中内化了可概括的知识,但如…

C++STL详解+代码分析+典例讲解

vector 的介绍: 1、vector是表示可变大小数组的序列容器。 2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。 3、vector与普通数组不同的是,vector的大小是可以动态改变的。 4、…

基于K-means与CNN的遥感影像分类方法

基于K-means与CNN的遥感影像分类 一、引言 1.研究背景 航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术,这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征,判断识别地面物体的属…

10 大 Mac 数据恢复软件深度评测

对于任何依赖计算机获取重要文件(无论是个人照片还是重要商业文档)的人来说,数据丢失可能是一场噩梦。值得庆幸的是,有多种专门为 Mac 用户提供的数据恢复工具,可以帮助检索丢失或意外删除的文件。在本文中&#xff0c…

基于Python+Selenium+Unittest+PO设计模式

一、什么是PO设计模式(Page Object Model) 1、Page Object是一种设计模式,它主要体现在对界面交互细节的封装上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性。 2、一般PO设计模式有三层 第一层&#x…

【基于NLP的微博情感分析:从数据爬取到情感洞察】

基于NLP的微博情感分析:从数据爬取到情感洞察 背景数据集技术选型功能实现创新点 今天我将分享一个基于NLP的微博情感分析项目,通过Python技术、NLP模型和Flask框架,对微博数据进行清洗、分词、可视化,并利用NLP和贝叶斯进行情感分…

基于Lucene的全文检索系统的实现与应用

文章目录 一、概念二、引入案例1、数据库搜索2、数据分类3、非结构化数据查询方法1) 顺序扫描法(Serial Scanning)2)全文检索(Full-text Search) 4、如何实现全文检索 三、Lucene实现全文检索的流程1、索引和搜索流程图2、创建索引1)获取原始…

Moco框架的搭建使用

一、前言   之前一直听mock,也大致了解mock的作用,但没有具体去了解过如何用工具或框架实现mock,以及也没有考虑过落实mock,因为在实际的工作中,很少会考虑用mock。最近在学java,刚好了解到moco框架是用于…

语言模型GPT与HuggingFace应用

受到计算机视觉领域采用ImageNet对模型进行一次预训练,使得模型可以通过海量图像充分学习如何提取特征,然后再根据任务目标进行模型微调的范式影响,自然语言处理领域基于预训练语言模型的方法也逐渐成为主流。以ELMo为代表的动态词向量模型开…

创建dockerSwarm nfs挂载

创建dockerSwarm nfs挂载 nfs高可用部署(lsyncd两主机双向同步) nfs高可用部署(lsyncd三主机三向同步) 1. 通过 Volume 1.1 创建 Docker Volume 每个 swarm 节点均创建相同名称的 Docker Volume(名称为 nfs120) docker volume create --driver local …

Jupyter notebook修改背景主题

打开Anaconda Prompt,输入以下内容 1. pip install --upgrade jupyterthemes 下载对应背景主题包 出现Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1时,说明已经下载安装完成 2. jt -l 查看背景主题列表 3. jt -t 主题名称(…

【docker 】centOS 安装docker

官网 docker官网 github源码 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装软件包 yum install -y yum-utils \device-mapper-persistent-data…

Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)

目录 一、前言 二、Bean配置信息重用 1.简介 : 2.实例 : 三、关于Bean的创建顺序 1.简介 : 2.实例 : 四、关于Bean的单例和多例 1.简介 : 2.实例 : 五、关于Bean的生命周期 1.简介 : 2.实例 : 六、Bean配置后置处理器 1.简介 : 2.实例 : 七、通过.properties文…

AcWing 93. 递归实现组合型枚举

Every day a AcWing 题目来源:93. 递归实现组合型枚举 解法1:回溯算法 标准的回溯算法模板题。 如果把 n、m 和数组 nums 都设置成全局变量的话,backtracking 回溯函数可以只用一个参数 level。 注意传参时 nums 不能用引用,…

Hive SQL间隔连续问题

问题引入 下面是某游戏公司记录的用户每日登录数据, 计算每个用户最大的连续登录天数,定义连续登录时可以间隔一天。举例:如果一个用户在 1,3,5,6,9 登录了游戏,则视为连续 6 天登录。 id dt1001 2021-12-121002 2021-12-12…

SQL语句---删除索引

介绍 使用sql语句删除索引。由于索引会占用一定的磁盘空间,因此,为了避免影响数据库性能,应该及时删除不再使用的索引。 命令 drop index 索引名 on 表名;例子 删除a表中的singleidx索引: drop index singleidx on a;下面是执…

GoldWave注册机 最新中文汉化破解版-安装使用教程

GoldWave是一个功能强大的数字音乐编辑器,是一个集声音编辑、播放、录制和转换的音频工具。它还可以对音频内容进行转换格式等处理。它体积小巧,功能却无比强大,支持许多格式的音频文件,包括WAV、OGG、VOC、 IFF、AIFF、 AIFC、AU…

FPGA 低延时 TCP UDP IP协议栈兼容1G 10G 25G MAC

在计算和数据中心、军事和航天、政府、仪器与测量、金融服务和广播和视频等行业,需要高可靠性的硬件和软件产品,帮助客户更快地开发部署新一代产品,减少技术和市场风险,我司研发的低延迟TCP/IP的IP核的传输速率高于传统网口&#…