kafka(三)生产问题

一、线上机器规划

二、线上问题优化

1、消息丢失的情况

消息发送端
a:acks=0: 表示producer不需要等待broker确认收到消息的回复就可以继续发送消息;性能高,但很容易丢失消息;
b:acks=1: 表示producer只需要等待leader写入成功的回复消息就可以继续发送消息了,若果follower没有写入成功,leader宕机,则消息丢失;
c:acks=-1或all: 这意味着leader需要等待所有备份(min.insync.replicas配置的备份个数)都成功写入日志,才会回复确认收到的消息,producer才会继续提交消息;当然如果min.insync.replicas配置的是1则也可能丢消息,跟acks=1情况类似。

消费端消费

如果消费这边配置的是自动提交,消费端未处理完,就自动提交offset了,但是此时你consumer直接宕机了,未处理完的数据丢失了,下次也消费不到了。

2、消息重复消费


消息发送端:发送端配置了超时重试,长时间未得到broker的回复,重新发送消息;
消息消费端:如果消费这边配置的是手动提交,刚拉取了一批数据处理了一部分,但还没来得及提交,服务挂了,重启后再次拉去消费。

解决方案:消费端应做好消费幂等的处理;

3、消费乱序

kafka消息的顺序消费要保证消息发送到同一个partition上,由于消费端消费的是固定的partition,才能保证消费顺序;

消息发送乱序:proudcer发送消息配置了重试,发送1、2、3三条消息,1消息发送失败重试,顺序则变成2、3、1;

kafka保证全链路消息顺序消费,需要从发送端开始,将所有有序消息发送到同一个分区,然后用一个消费者去消费,但是这种性能比较低,可以在消费者端接收到消息后将需要保证顺序消费的几条消费发到内存队列(可以搞多个),一个内存队列开启一个线程顺序处理消息。

4、消息积压

kafka的消息是定期删除的,不是消费完删除,是消费端消费滞后,所以kafka的消息积压指的是用户感知上的消息积压;

a:消息发送方发送过多消息,消费端消费过慢,代码层面做代码优化,提前预知可将消息分散到多个分片上,增加更多的消费者进行消费;(kafka的分片是被固定的消费者消费的,若消费者数量超出分片数量增加再多也没有意义,详见上一张讲解内容);

b:消费端有bug导致无法消费,可在消费的过程中将有问题的消息推送到其它topic(类似死信队列),再做相应处理,避免影响其它正常消费的消息;

5、延时队列(kafka不支持延时队列,需要自己实现)

所谓延时队列指的是消息发送后并不希望立即消费,需要等待一段时间再进行消费;

实现思路:发送延时消息时先把消息按照不同的延迟时间段发送到指定的队列中(topic_1s,topic_5s,topic_10s,...topic_2h,这个一般不能支持任意时间段的延时),然后通过定时器进行轮训消费这些topic,查看消息是否到期,如果到期就把这个消息发送到具体业务处、理的topic中,队列中消息越靠前的到期时间越早,具体来说就是定时器在一次消费过程中,对消息的发送时间做判断,看下是否延迟到对应时间了,如果到了就转发,如果还没到这一次定时任务就可以提前结束了。

6、消息回溯

如果某段时间对已消费消息计算的结果觉得有问题,可能是由于程序bug导致的计算错误,当程序bug修复后,这时可能需要对之前已消费的消息重新消费,可以指定从多久之前的消息回溯消费,这种可以用consumer的offsetsForTimes、seek等方法指定从某个offset偏移的消息开始消费,参见上节课的内容。

7、分区数越多吞吐量越高吗

kafka的分区数量可以根据kafka的脚本进行压测:往test里发送一百万消息,每条设置1KB
throughput 用来进行限流控制,当设定的值小于 0 时不限流,当设定的值大于 0 时,当发送的吞吐量大于该值时就会被阻塞一段时间
bin/kafka‐producer‐perf‐test.sh ‐‐topic test ‐‐num‐records 1000000 ‐‐record‐size 1024 ‐‐throughput ‐1 ‐‐producer‐props bootstrap.servers=192.168.65.60:9092 acks=1

一般情况下分片数量与broker数量一致性能最好(具体还是要通过压测决定),分区越多,多种因素会导致性能反而下降(磁盘,文件系统,I/O)

8、kafka的幂等性

proudcer重试发送多次消息,只需在生产者加上参数 props.put(“enable.idempotence”, true) 即可,默认是false不开启。

消费者发送的时候会自动携带PID+Sequence Number一起发送给broker;下次重发不会再接收;

9、kafka的事务

Kafka的事务不同于Rocketmq,Rocketmq是保障本地事务(比如数据库)与mq消息发送的事务一致性,Kafka的事务主要是保障一次发送多条消息的事务一致性(要么同时成功要么同时失败);

10、kafka高性能的原因

        a、磁盘顺序读写

        b、读写批量读取以及压缩传输

        c、数据传输零拷贝

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

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

相关文章

《游戏-01_3D-开发》之—人物动画控制器

创建变量, 创建线, 连接, 选中线会变为蓝色,新增变量, 设置线, 双击子层进入子层, 创建变量, 双击SkillPanel 拖拽好之后返回上一层, 依次连接, 设置线&#…

《WebKit 技术内幕》学习之十四(1):调式机制

第14章 调试机制 支持调试HTML、CSS和JavaScript代码是浏览器或者渲染引擎需要提供的一项非常重要的功能,这里包括两种调试类型:其一是功能,其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中的问题,性能调…

03. 静态路由

文章目录 一. 静态路由概述1.1. 概述1.2. 路由信息获取方式1.3. 路由表的参数1.4. 路由协议的优先级1.5. 最优路由条目优先1.6. 最长前缀匹配原则 二. 实验实操2.1. 实验1:静态路由2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤(1)配置网…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

写一份简单的产品说明书:格式和排版建议

现在的市场竞争那么激烈,拥有一份简洁明了的产品说明书可以说是很重要的。产品说明书不仅向用户提供了对产品的详细了解,还能够树立品牌形象,提升用户体验。 | 一、写一份简单的产品说明书—一些建议 1.创意封面设计 一个吸引人的封面设计能…

wpf控件Expander集合下的像素滚动

项目场景:Expander集合滚动 如下图,有一个Expander集合,且设置 ScrollViewer.VerticalScrollBarVisibility "Auto" 每个Expaner下包含有若干元素,当打开Expader(即IsExpanded "true")时&#…

利用Python实现科学式占卜

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜…

测试人年终总结:入行三年,下一步怎么走,思想碰撞

原贴地址:入行三年,下一步怎么走,思想碰撞 TesterHome 熟悉环境,进步缓慢;停止思考,举步不前(为什么会有这篇文章why 初心变质:计算机系毕业,毕业时的打算是从测试进&a…

MTP与管理壳(AAS)有异曲同工之妙

在过去的几年中,流程工业中的不同部门(例如制药、精细化学品以及食品和饮料部门)遇到了一系列共同且可比较的新兴挑战。这些挑战包括: 新产品的需求迅速接连不断,更快交货和更低价格的压力,更多定制产品&a…

有向图的拓扑序列——拓扑排序

问题描述 什么是拓扑序列 若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。图中不能有环图中至少存在一个点的入度为0 如何求拓扑序列? 计算出每个节点的…

【Python编程工具】【ssh连接Docker容器】如何使用Docker容器里的python环境,如何调试在容器中的代码

文章目录 方案一览Gateway软件介绍启动容器配置apt源在容器中安装SSH服务器配置SSH服务器生成SSH密钥启动SSH服务为root创建密码连接到容器使用Gateway 方案一览 本篇博客将介绍如何在Docker容器中打开SSH连接服务,以及如何使用JetBrains Gateway软件进行代码调试。…

leetcode-hot100双指针专题

第一题:移动零 题目链接 283. 移动零 - 力扣(LeetCode) 解题思路 我们创建两个指针i,j,第一次遍历的时候指针j用来记录当前面有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后&…

【网站项目】基于SSM的249作业提交与查收系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

企业AI应用开发:定制AI解决方案助力企业智能转型

随着人工智能技术的迅猛发展,越来越多的企业开始意识到人工智能在业务中的价值,并将其应用于实际场景中。而在人工智能应用开发领域,定制AI解决方案成为了企业智能转型的重要一环。 那么,什么是企业AI应用开发呢?简单…

java基础:随机生成几个整数存放到数组里并按顺序输出案例分析

思路分析 具体步骤如下: 创建一个数组,用于存放生成的随机数。 定义最大值和最小值,用于限定随机数的取值范围。 使用循环和Random类中的方法生成随机数,并将其添加到数组中。 使用Arrays类中的sort()方法对数组进行排序&#…

fcpx视频剪辑:Final Cut Pro for Mac 10.7.1中文版

Final Cut Pro是由苹果公司开发的一款专业视频编辑软件,主要用于影片的后期剪辑、调色、特效、音频处理等方面。 以下是Final Cut Pro的特点: 高效的视频编辑功能:Final Cut Pro提供了丰富的视频编辑工具,包括多轨道编辑、剪切、修…

apipost和curl收不到服务器响应的HTTP/1.1 404 Not Found

windows的apipost发送请求后,服务器响应了HTTP/1.1 404 Not Found,但是apipost一直显示发送中。 linux上的curl也一样。 使用wireshark抓包发现收到了响应,但是wireshark识别不了(图中是回应404后关闭了连接)&#xff…

Google翻译 替换插件 沉浸式翻译(放松一下)

下载地址 Greasy Fork - 安全、实用的用户脚本大全 安装后 测试 随便找一篇文章 点击右侧粉红标签图标 更多

基于云原生技术栈构建企业统一基础技术平台(总纲)

一、概述 本文主要介绍基于云原生技术栈建设企业技术平台的总纲,该技术平台对业务应用全生命周期进行管理和支撑,提供从需求交付、生产运行、稳定保障、资产运营,以及安全生产的体系化解决方案,为企业自建或采购技术平台提供参考。…

20240124-我的第一个知识星球

2024年01月25日22:50:04 家中 我在知识星球上创建了我第一个知识星球。事情是这样的: 去年搞完WHV之后,其实还是很受打击的,毕竟付出的辛苦没有得到相应的成绩,还是很失落的。但是那个时候失落没多久,想到要去小红书发帖子,把程序分享出去,我的程序不能白开发,我想让…