百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

面试必备之kafka生产者发送流程+优化

liuian 2025-03-29 19:29 13 浏览

Kafka发送流程与优化经验:从“发个消息”到“发个火箭”

大家好,我是你们的Kafka老司机,今天咱们来聊聊Kafka的消息发送流程和优化经验。如果你觉得Kafka只是一个“发消息”的工具,那你就太小看它了!它可是分布式系统中的“火箭发射器”,能把你的消息以光速送到目的地。不过,想要驾驭这枚“火箭”,你得先了解它的发射流程,再掌握一些优化技巧。废话不多说,系好安全带,咱们出发!


1. Kafka发送流程:从“发个消息”到“发个火箭”

1.1 消息发送的基本流程

当你调用KafkaProducer.send()方法时,你以为只是简单地发了个消息?No no no,这背后可是有一场精密的“火箭发射”流程:

  1. 消息封装:你把消息打包成一个ProducerRecord,就像把货物装进火箭的货舱。
  2. 序列化:Kafka会把你的消息序列化成字节数组,就像把货物压缩成适合发射的形态。
  3. 分区选择:Kafka会根据分区策略(比如轮询、哈希等)决定把消息发送到哪个分区,就像选择火箭的发射轨道。
  4. 消息累加:消息会被暂存到一个叫RecordAccumulator的缓冲区,就像把货物暂时存放在发射台的仓库里。
  5. 批次发送:Kafka会把多个消息打包成一个批次(Batch),然后通过Sender线程发送到Broker,就像把多个货物一次性发射到太空。
  6. Broker接收:Broker收到消息后,会把它写入对应的分区日志(Log Segment),就像把货物安全送到太空站。

1.2 关键组件解析

  • ProducerRecord:消息的载体,包含主题、分区、键、值等信息。
  • RecordAccumulator:消息的缓冲区,负责暂存消息并打包成批次。
  • Sender线程:负责从缓冲区取出批次,并通过网络发送到Broker。
  • 分区器(Partitioner):决定消息发送到哪个分区。
  • 序列化器(Serializer):把消息对象转换成字节数组。




2. Kafka发送优化:从“火箭发射”到“光速传送”

2.1 优化目标

Kafka发送消息的性能优化,主要围绕以下几个目标:

  1. 提高吞吐量:让Kafka能同时发送更多的消息。
  2. 降低延迟:让消息尽快到达Broker。
  3. 减少资源消耗:让Kafka在发送消息时占用更少的CPU、内存和网络带宽。

2.2 优化技巧

技巧1:调整批次大小(batch.size)

  • 默认值:16 KB
  • 优化建议:如果你的消息量很大,可以适当增加批次大小(比如32 KB或64 KB),这样可以减少网络请求的次数,提高吞吐量。
  • 注意事项:批次大小不能太大,否则会导致消息延迟增加。

技巧2:调整缓冲区大小(buffer.memory)

  • 默认值:32 MB
  • 优化建议:如果你的消息量非常大,可以增加缓冲区大小(比如64 MB或128 MB),这样可以避免缓冲区满了导致消息发送阻塞。
  • 注意事项:缓冲区大小不能无限增加,否则会占用过多内存。

技巧3:调整消息压缩(compression.type)

  • 默认值:none(不压缩)
  • 优化建议:如果你的消息内容较大,可以启用压缩(比如gzip、snappy或lz4),这样可以减少网络传输的数据量,提高吞吐量。
  • 注意事项:压缩会增加CPU开销,需要根据实际情况权衡。

技巧4:调整消息确认机制(acks)

  • 默认值:1(Leader副本确认)
  • 优化建议
    • 如果你对消息可靠性要求不高,可以设置为0(不需要确认),这样可以提高吞吐量。
    • 如果你对消息可靠性要求很高,可以设置为all(所有副本确认),但会增加延迟。
  • 注意事项:acks=all可能会导致性能下降,需要根据业务需求选择。

技巧5:调整重试机制(retries和retry.backoff.ms)

  • 默认值:retries=2147483647(无限重试),retry.backoff.ms=100
  • 优化建议
    • 如果你的网络环境不稳定,可以增加重试次数和重试间隔。
    • 如果你的网络环境稳定,可以减少重试次数,避免不必要的延迟。
  • 注意事项:重试次数过多可能会导致消息重复发送,需要结合幂等性机制使用。

技巧6:启用幂等性(enable.idempotence)

  • 默认值:false
  • 优化建议:如果你需要保证消息的精确一次(Exactly Once)语义,可以启用幂等性。
  • 注意事项:启用幂等性会增加一些性能开销。




3. 实战经验:从“踩坑”到“起飞”

3.1 踩坑1:消息发送阻塞

问题描述:消息发送时,send()方法阻塞,导致程序卡住。
解决方案

  • 检查buffer.memory是否设置过小,导致缓冲区满了。
  • 检查网络连接是否正常,Broker是否可用。

3.2 踩坑2:消息丢失

问题描述:消息发送成功,但Broker没有收到。
解决方案

  • 检查acks设置,确保消息被Broker确认。
  • 启用幂等性,避免消息重复或丢失。







3.3 踩坑3:性能瓶颈

问题描述:消息发送吞吐量低,延迟高。
解决方案

  • 调整batch.size和linger.ms,优化批次发送。
  • 启用消息压缩,减少网络传输数据量。

4. 总结:从“发个消息”到“发个火箭”

Kafka的消息发送流程看似简单,但背后却隐藏着许多细节和优化点。通过调整批次大小、缓冲区大小、压缩方式等参数,你可以让Kafka从“发个消息”变成“发个火箭”,轻松应对高并发、大流量的场景。

当然,优化是一个持续的过程,需要根据实际业务需求和环境不断调整。希望这篇文章能帮你少走弯路,早日成为Kafka的“火箭发射专家”!如果你觉得有用,别忘了点赞、收藏、转发三连哦!我是你们的Kafka老司机,下次再见!

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...