kafka生产者之发送模式与ACK

文章目录

  • Kafka的发送模式
  • Kafka的ack机制
  • 发送模式与ack的关联
  • 重试次数
  • 总结

在Kafka中,发送模式与ack机制紧密相关,它们共同影响着消息发送的可靠性和性能。

Kafka的发送模式

  • 发后即忘(Fire and Forget):生产者发送消息后不等待任何来自服务器的确认,继续处理下一条消息,实现简单、低延迟,但可能会有消息丢失。

  • 同步发送(Sync):生产者发送消息后,会阻塞等待服务器的确认响应,确保消息发送成功,可靠性高,但会降低发送速度,影响吞吐量。

  • 异步发送(Async):生产者发送消息后,通过回调函数处理服务器的响应,消息发送后可继续执行其他操作,能提高吞吐量,也可通过回调函数处理发送结果。

Kafka的ack机制

  • ack=0:生产者发送消息后,无需等待服务器确认,服务器可能没收到消息就认为发送完成,可能导致消息丢失,延迟最低但可靠性差,适用于允许少量消息丢失且追求极致性能的场景。

  • ack=1:生产者发送消息后,只要分区的leader副本成功写入消息,就会收到确认,若leader副本写入后follower副本同步前leader故障,可能丢失消息,性能和可靠性较平衡。

  • ack=-1或all:生产者发送消息后,需等待所有同步中的副本都成功写入消息才会收到确认,保证消息不丢失,可靠性最高,但可能因等待所有副本确认而增加延迟,降低吞吐量。

发送模式与ack的关联

  • 发后即忘:通常搭配ack=0,以追求最大的发送性能和最低延迟,不在乎消息是否丢失。

  • 同步发送:常与ack=1或ack=-1搭配,需确保消息可靠到达服务器,若对消息可靠性要求极高选ack=-1,若能容忍一定程度数据丢失以换取性能选ack=1。

  • 异步发送:可与各种ack值搭配,根据业务场景选择。如对实时性要求高但能接受少量消息丢失可选ack=1搭配异步发送,通过回调函数处理发送结果;若要保证消息可靠性,可将ack=-1与异步发送结合,通过回调函数确保消息处理。

重试次数

retries参数用来配置生产者重试的次数,默认值为0,即在发生异常的时候不进行任何重试动作。消息在从生产者发出到成功写入服务器之前可能发生一些临时性的异常,比如网络抖动、leader副本的选举等,这种异常往往是可以自行恢复的,生产者可以通过配置retries大于0的值,以此通过内部重试来恢复而不是一味地将异常抛给生产者的应用程序。如果重试达到设定的次数,那么生产者就会放弃重试并返回异常。不过并不是所有的异常都是可以通过重试来解决的,比如消息太大,超过max.request.size参数配置的值时,这种方式就不可行了。

重试还和另一个参数retry.backoff.ms有关,这个参数的默认值为100,它用来设定两次重试之间的时间间隔,避免无效的频繁重试。在配置retries和retry.backoff.ms之前,最好先估算一下可能的异常恢复时间,这样可以设定总的重试时间大于这个异常恢复时间,以此来避免生产者过早地放弃重试。

Kafka可以保证同一个分区中的消息是有序的。如果生产者按照一定的顺序发送消息,那么这些消息也会顺序地写入分区,进而消费者也可以按照同样的顺序消费它们。对于某些应用来说,顺序性非常重要,比如MySQL的binlog传输,如果出现错误就会造成非常严重的后果。如果将acks参数配置为非零值,并且max.in.flight.requests.per.connection参数配置为大于1的值(这部分在kafka生产端之架构及工作原理中会详细讲解该配置),那么就会出现错序的现象:如果第一批次消息写入失败,而第二批次消息写入成功,那么生产者会重试发送第一批次的消息,此时如果第一批次的消息写入成功,那么这两个批次的消息就出现了错序。一般而言,在需要保证消息顺序的场合建议把参数max.in.flight.requests.per.connection配置为1,而不是把acks配置为0,不过
这样也会影响整体的吞吐。

总结

通过上面的讲解我们应该可以知道如何尽可能的保障生产者消息不丢失。

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

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

相关文章

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境(IDE),它提供了许多强大的功能,使得开发者能够高效地创建Android应用。如果你是Android开发的初学者,本文将引导你如何在Android Studio中开发一个简单的Android应用…

【Qt 常用控件】输入类控件1(QLineEdit和QTextEdit 输入框)

目录 1.QLineEdit 单行输入框 例:输入个人信息,通过按钮提交 例:为输入框设置验证器,检查输入的电话 例:验证两次输入的密码是否一致 例:是否显示密码按钮,toggled信号。 2.QTextEdit多行输入框 、QPl…

Bash (Bourne-Again Shell)、Zsh (Z Shell)

文章目录 1. 历史背景2. 主要区别3. 功能对比自动补全插件和主题路径扩展提示符定制 4. 性能5. 使用场景6. 如何切换 Shell7. 总结 以下是 Bash 和 Zsh 之间的主要区别,列成表格方便对比: 特性BashZsh默认Shell大多数Linux发行版默认ShellmacOS默认She…

Jetbrains IDE http客户端使用教程

简介 JetBrains IDE(如IntelliJ IDEA, WebStorm, PhpStorm和PyCharm)自带一个内置的HTTP客户端,允许直接从IDE发送HTTP请求,而无需使用第三方工具,如Postman或cURL。 JetBrains IDE 中的 HTTP…

android手机安装deepseek-r1:1.5b

序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

PWM波形输出

一、想要达到的效果 二、实现代码 因为是在1khz的频率下,所以用重新配置定时器0,定时长度为100微妙 void Timer0Init(void) //100微秒12.000MHz {AUXR | 0x80; //定时器时钟1T模式TMOD & 0xF0; //设置定时器模式TL0 0x50; //设置定时初值TH0 …

Spring Boot整合MQTT

MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址:Download | Eclipse Mosquitto,进行下载,以win版本为例 下载完成后,在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…

前端 CSS 动态设置样式::class、:style 等技巧详解

一、:class 动态绑定类名 v-bind:class&#xff08;缩写为 :class&#xff09;可以动态地绑定一个或多个 CSS 类名。 1. 对象语法 通过对象语法&#xff0c;可以根据条件动态切换类名。 <template><div :class"{ greenText: isActive, red-text: hasError }&…

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘&#xff0c;占用空间太大了&#xff0c;想给安装到其他盘&#xff0c;网上找了半天的都不对 正确安装命令&#xff1a; start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…

手动配置IP

手动配置IP&#xff0c;需要考虑四个配置项&#xff1a; 四个配置项 IP地址、子网掩码、默认网关、DNS服务器 IP地址&#xff1a;格式表现为点分十进制&#xff0c;如192.168.254.1 子网掩码&#xff1a;用于区分网络位和主机位 【子网掩码的二进制表达式一定是连续的&#…

Qt:常用控件

目录 控件概述 控件体系的发展 按钮类控件 QPushButton QRadioButton QCheckBox QToolButton 显示类控件 QLabel QLCDNumber QProgressBar QCalendarWidget 输入类控件 QLineEdit QTextEdit QComboBox QSpinBox QDateEdit & QTimeEdit QDial QSlider …

【漫话机器学习系列】087.常见的神经网络最优化算法(Common Optimizers Of Neural Nets)

常见的神经网络优化算法 1. 引言 在深度学习中&#xff0c;优化算法&#xff08;Optimizers&#xff09;用于更新神经网络的权重&#xff0c;以最小化损失函数&#xff08;Loss Function&#xff09;。一个高效的优化算法可以加速训练过程&#xff0c;并提高模型的性能和稳定…

4G核心网的演变与创新:从传统到虚拟化的跨越

4G核心网 随着移动通信技术的不断发展&#xff0c;4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性&#xff0c;也为未来的5G、物联网&#xff08;LOT&#xff09;和边缘计算等技术的发展奠定了基础。…

拉格朗日插值法的matlab实现

一、基本原理 比如有如下这些点 x1x2x3x4y1y2y3y4 那么在拉个朗日原理中可以把过这些点的曲线表示为&#xff1a; 其g(x)y叫做一个插值基函数&#xff08;开关&#xff09;&#xff0c;当xx1时&#xff0c;g1(x)1&#xff0c;而当xx2,x3,x4时&#xff0c;g1(x)都为0&#xf…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;?? 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xff1a;WebSt…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…

day44 QT核心机制

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …