当前位置: 首页 > article >正文

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.kler.cn/a/538435.html

相关文章:

  • 哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测
  • 【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)
  • Nginx部署Umi React前端项目标准配置
  • kubernetes 集群命令行工具 kubectl
  • C++ 顺序表
  • Python分享20个Excel自动化脚本
  • 【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)
  • 人工智能入门 数学基础 线性代数 笔记
  • 6.Python函数:函数定义、函数的类型、函数参数、函数返回值、函数嵌套、局部变量、全局变量、递归函数、匿名函数
  • 【专题】2025年我国机器人产业发展形势展望:人形机器人量产及商业化关键挑战报告汇总PDF洞察(附原数据表)
  • 基于大语言模型的自然语言研究
  • 【python】matplotlib(animation)
  • LLM:DeepSeek 系列(一)
  • 基于Flask的当当网畅销图书榜单可视化分析系统的设计与实现
  • 国产编辑器EverEdit - 查找功能详解
  • 【手写公式识别】MEMix: Improving HMER with Diverse Formula Structure Augmentation 论文阅读
  • Java Stream API:高效数据处理的利器引言
  • 虚拟局域网之详解(Detailed Explanation of Virtual Local Area Network)
  • Docker 常见问题解决方法
  • Docker-compose 编排lnmp(dockerfile) 完成Wordpress
  • 人工智能图像分割之Mask2former源码解读
  • java-list源码分析
  • LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)
  • 微信小程序地图开发总结-规划路线
  • RocketMQ实战—7.生产集群部署和生产参数
  • Enterprise Architect 17 全面升级:重塑建模体验,赋能复杂系统设计