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

云原生时代 Kafka 深度实践:03进阶特性与最佳实践

3.1 数据可靠性与一致性

Producer 端可靠性策略

Kafka 通过acks参数控制消息确认机制,不同设置适用于不同场景:

  • acks=0:Producer 发送消息后不等待 Broker 确认,立即返回。这种模式吞吐量最高,但可能丢失消息(如网络故障导致消息未到达 Broker)。适用于对可靠性要求不高的场景,如日志收集。
  • acks=1(默认):Producer 发送消息后,等待 Leader 副本接收成功即返回。若 Follower 副本未同步时 Leader 宕机,可能导致消息丢失。适用于对可靠性有一定要求,但可接受少量数据丢失的场景。
  • acks=all:Producer 发送消息后,等待 ISR 集合中所有副本都接收成功才返回。这种模式保证消息不丢失,但延迟较高。适用于对可靠性要求极高的场景,如金融交易。
幂等性生产者

开启幂等性(enable.idempotence=true)可避免消息重复发送:

props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, "true");

幂等性生产者通过为每个消息分配唯一 ID(PID)和序列号(Sequence Number),确保 Broker 不会重复写入相同消息。

Consumer 端 Exactly-Once 语义

Kafka 提供三种消费语义:

  • At-Most-Once(最多一次):消费失败后不重试,可能导致消息丢失。
  • At-Least-Once(至少一次):消费失败后重试,可能导致消息重复消费。
  • Exactly-Once(精确一次):通过事务或幂等性保证每条消息仅被消费一次。

实现 Exactly-Once 语义的关键是将消息消费与 Offset 提交作为原子操作:

// 配置事务
props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-transactional-id");
producer.initTransactions();try {producer.beginTransaction();// 消费消息ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {// 处理消息process(record);// 发送结果到输出Topicproducer.send(new ProducerRecord<>("output_topic", record.key(), processResult));}// 提交消费位移和生产的消息producer.sendOffsetsToTransaction(currentOffsets, "test_group");producer.commitTransaction();
} catch (Exception e) {producer.abortTransaction();
}

3.2 分区分配与负载均衡

Consumer Group 分区分配策略

Kafka 提供三种内置分区分配策略:

  • RangeAssignor(默认):按 Topic 的分区 ID 排序,依次分配给 Consumer。例如,Topic 有 5 个分区,Consumer Group 有 2 个 Consumer,则 Consumer1 分配分区 0-2,Consumer2 分配分区 3-4。可能导致分配不均。
  • RoundRobin:将所有 Topic 的所有分区按顺序轮询分配给 Consumer。适用于消费多个 Topic 的场景,分配更均匀。
  • StickyAssignor:在 Rebalance 时尽量保持原有分配关系,减少分区移动。例如,新增 Consumer 时,仅将部分分区从其他 Consumer 转移给新 Consumer。

通过partition.assignment.strategy参数配置分配策略:

props.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG, Collections.singletonList(StickyAssignor.class.getName()));

动态 Rebalance 机制

当 Consumer 加入或退出 Group、Topic 分区数变更时,会触发 Rebalance:

Coordinator 选举:Group 中第一个启动的 Consumer 向任意 Broker 发送请求,获取 Group Coordinator(负责管理该 Group 的 Broker)。

  1. 成员注册:所有 Consumer 向 Coordinator 注册,Coordinator 收集所有成员信息。
  2. 分区分配:Coordinator 选择一种分配策略,计算每个 Consumer 应分配的分区。
  3. 分配结果通知:Coordinator 将分配结果发送给所有 Consumer。

自定义分区分配策略

实现org.apache.kafka.clients.consumer.PartitionAssignor接口,可根据业务需求自定义分区分配逻辑。例如,按消息类型将特定分区分配给指定 Consumer:

public class CustomPartitionAssignor implements PartitionAssignor {@Overridepublic Subscription subscription(Set<String> topics) {return new Subscription(new ArrayList<>(), Collections.singletonMap("custom_config", "value"));}@Overridepublic Map<String, Assignment> assign(Cluster metadata, Map<String, Subscription> subscriptions) {// 自定义分区分配逻辑}// 其他接口方法实现
}

3.3 监控与运维

内置监控指标

Kafka 通过 JMX(Java Management Extensions)暴露大量监控指标,主要分为三类:

  • Broker 级别:如MessagesInPerSec(每秒接收消息数)、BytesInPerSec(每秒接收字节数)、FailedProduceRequestsPerSec(每秒失败的生产请求数)。
  • Topic 级别:如PartitionCount(分区数)、UnderReplicatedPartitions(欠复制分区数)。
  • Consumer 级别:如ConsumerLag(消费滞后量)、RecordsConsumedPerSec(每秒消费记录数)。

常用监控工具

# prometheus.yml配置示例
scrape_configs:- job_name: 'kafka'static_configs:- targets: ['kafka-broker-1:9100', 'kafka-broker-2:9100']  # JMX Exporter端口

  1. Kafka Manager:开源的 Kafka 集群管理工具,支持 Topic 创建、分区管理、集群状态监控等功能。
  2. Prometheus + Grafana:企业级监控方案,通过 Prometheus 采集 Kafka 指标,Grafana 可视化展示。需配置 JMX Exporter 作为中间件:
  3. Confluent Control Center:Confluent 提供的商业监控工具,支持 Kafka 集群、Schema Registry、Kafka Connect 等组件的全方位监控。

运维命令与故障排查

     1.查看 Consumer Group 消费滞后量

/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 \--describe --group test_group

     2.手动重置消费位移

    /opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 \--group test_group --topic test_topic --reset-offsets --to-earliest --execute

         3.修复副本同步问题

      /opt/kafka/bin/kafka-replica-verification.sh --bootstrap-server localhost:9092 \--topic test_topic --include-offline-partitions

            4.常见故障排查: 

        • 生产者无法连接 Broker:检查网络连通性、防火墙配置、bootstrap.servers参数。
        • 消费者消费滞后:检查 Consumer 性能、Topic 分区数、消息处理逻辑。
        • Broker 磁盘空间不足:清理过期日志、增加磁盘容量、调整log.retention.hours参数。

        相关文章:

        云原生时代 Kafka 深度实践:03进阶特性与最佳实践

        3.1 数据可靠性与一致性 Producer 端可靠性策略 Kafka 通过acks参数控制消息确认机制&#xff0c;不同设置适用于不同场景&#xff1a; acks0&#xff1a;Producer 发送消息后不等待 Broker 确认&#xff0c;立即返回。这种模式吞吐量最高&#xff0c;但可能丢失消息&#x…...

        基于关联表字段映射的批量数据更新 SQL 实现方案(AIGC)

        UPDATE po_upfiles u JOIN po_micro m ON u.from_id = m.ent_id_old SET u.from_id = m.ent_id; 我的提问 批量更新po_upfiles数据中from_id=ent_id_old的数据中from_id为ent_id,语句怎么写“问题重新按照适合AI的逻辑进行提问,如何修改 精确版...

        Hadoop复习(二)

        部署Hadoop 考试不考部署&#xff0c;就复习选择和大题 问题 1 单项选择 2 / 2 分 下面哪个是MapReduce的核心配置文件 core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml 问题 2 单项选择 2 / 2 分 下面哪个是HDFS的核心配置文件 core-site.xml hdf…...

        C 语言开发中常见的开发环境

        目录 1.Dev-C 2.Visual Studio Code 3.虚拟机 Linux 环境 4.嵌入式 MCU 专用开发环境 1.Dev-C 使用集成的 C/C 开发环境&#xff08;适合基础学习&#xff09;,下载链接Dev-C下载 - 官方正版 - 极客应用 2.Visual Studio Code 结合 C/C 扩展 GCC/MinGW 编译器&#xff0c…...

        vscode命令行debug

        vscode命令行debug 一般命令行debug会在远程连服务器的时候用上&#xff0c;命令行debug的本质是在执行时暴露一个监听端口&#xff0c;通过进入这个端口&#xff0c;像本地调试一样进行。 这里提供两种方式&#xff1a; 直接在命令行中添加debugpy&#xff0c;适用于python…...

        Matlab作图之 subplot

        1. subplot(m, n, p) 将当前图形划分为m*n的网格&#xff0c;在 p 指定的位置创建坐标轴 matlab 按照行号对子图的位置进行编号 第一个子图是第一行第一列&#xff0c;第二个子图是第二行第二列......... 如果指定 p 位置存在坐标轴&#xff0c; 此命令会将已存在的坐标轴设…...

        Springboot 项目一启动就获取HttpSession

        在 Spring Boot 项目中&#xff0c;HttpSession 是有状态的&#xff0c;通常只有在用户发起 HTTP 请求并建立会话后才会创建。因此&#xff0c;在项目启动时&#xff08;即应用刚启动还未处理任何请求&#xff09;是无法获取到 HttpSession 的。 方法一&#xff1a;使用 HttpS…...

        PostgreSQL的扩展 insert_username

        PostgreSQL的扩展 insert_username insert_username 是 PostgreSQL 的一个实用扩展&#xff0c;用于自动记录数据行的创建者和最后修改者信息。这个扩展特别适合需要审计跟踪的应用场景。 一 扩展安装与启用 1.1 安装扩展 -- 使用超级用户安装 CREATE EXTENSION insert_use…...

        【机器学习基础】机器学习入门核心算法:层次聚类算法(AGNES算法和 DIANA算法)

        机器学习入门核心算法&#xff1a;层次聚类算法&#xff08;AGNES算法和 DIANA算法&#xff09; 一、算法逻辑二、算法原理与数学推导1. 距离度量2. 簇间距离计算&#xff08;连接标准&#xff09;3. 算法伪代码&#xff08;凝聚式&#xff09; 三、模型评估1. 内部评估指标2. …...

        Google Play的最新安全变更可能会让一些高级用户无法使用App

        喜欢Root或刷机的Android用户要注意了&#xff0c;Google最近全面启用了新版Play Integrity API&#xff0c;可能会导致部分用户面临无法使用某些App的窘境。Play Integrity API是Google提供给开发者的工具&#xff0c;用于验证App是否在“未修改”的设备上运行。 许多重要应用…...

        深度学习篇---人脸识别中的face-recognition库和深度学习

        深度学习方法和使用 Python 的face_recognition库进行人脸识别在技术原理、实现方式和应用场景上有显著区别&#xff0c;以下从多个维度对比分析&#xff1a; 一、技术原理 1. 深度学习方法 核心逻辑&#xff1a;基于神经网络&#xff08;如卷积神经网络 CNN&#xff09;构建…...

        (11)java+ selenium->元素定位之By_tag_name

        1.简介 继续WebDriver关于元素定位,这篇介绍By ClassName。tagName是DOM结构的一部分,其中页面上的每个元素都是通过输入标签,按钮标签或锚定标签等标签定义的。每个标签都具有多个属性,例如ID,名称,值类等。就其他定位符而言在Selenium中,我们使用了标签的这些属性值来…...

        React---day5

        4、React的组件化 组件的分类&#xff1a; 根据组件的定义方式&#xff0c;可以分为&#xff1a;函数组件(Functional Component )和类组件(Class Component)&#xff1b;根据组件内部是否有状态需要维护&#xff0c;可以分成&#xff1a;无状态组件(Stateless Component )和…...

        Java开发之定时器学习

        面试 一、线程池实现定时器 核心代码&#xff1a; public static void main(String[] args) {ScheduledExecutorService scheduledExecutorService Executors.newScheduledThreadPool(5);Runnable runnable () -> System.out.println("当前线程"Thread.current…...

        HealthBench医疗AI评估基准:技术路径与核心价值深度分析(上)

        引言:医疗AI评估的新范式 在人工智能技术迅猛发展的当下,医疗AI系统已逐渐从实验室走向临床应用。然而,医疗领域的特殊性要求这些系统不仅需要在技术指标上表现出色,更需要在实际临床场景中展现出可靠、安全且有效的性能。长期以来,医疗AI评估领域面临着三个核心挑战:评…...

        Windows+VSCode搭建小智(xiaozhi)开发环境

        作为一名DIY达人&#xff0c;肯定不会错过最近很火的“小智AI聊天机器人”&#xff0c;网上教程非常丰富&#xff0c;初级玩家可以直接在乐鑫官方下载ESP-IDF安装包并经过简单的菜单式配置后&#xff0c;即可进行代码编译和烧录&#xff08;详见&#xff1a;Docs&#xff09;。…...

        VueScan Pro v9.8.45.08 一款图像扫描软件,中文绿色便携版

        VueScan是著名的第三方底片扫描仪驱动程序&#xff0c;支持市场可见绝大多数型号的底片扫描仪&#xff0c;可以更为灵活地控制扫描过程&#xff0c;更深入地发掘硬件潜力&#xff0c;获取色彩 完美的高质量扫描结果。VueScan支持200种以上的底片类型&#xff0c;在剪取图像时制…...

        FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验

        RTOS 基础概念 想象一下&#xff0c;你是一个忙碌的厨师&#xff0c;在厨房里同时要完成煎牛排和煮意大利面两项任务。 1.传统单线程模式&#xff08;没有RTOS&#xff09; 如果你只能按顺序一项一项地做&#xff0c;就会是这样的过程&#xff1a; 先煎一会儿牛排然后去看看…...

        Python后端开发实战:从0到1搭建高可用API服务

        引言 Python凭借其简洁的语法和丰富的生态(如Django、Flask、FastAPI等框架),已成为后端开发的主流语言之一。本文将结合一个真实电商API项目,分享从架构设计到部署上线的完整流程,并总结开发过程中常见的坑与最佳实践。 一、实战案例:电商API开发流程 1.1 技术选型 框…...

        房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块

        房屋租赁系统 JavaVue.jsSpringBoot&#xff0c;包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/16YRGBPsfbd4_HxXhO0jM5Q 密码&#xff1a;smk4 摘 要 房屋是人类生活栖息的重要…...

        4、ubuntu系统 | 文本和目录操作函数

        1、目录操作函数 ls&#xff08;列出目录内容&#xff09; 用途&#xff1a;列出指定目录中的文件和子目录。语法&#xff1a;ls [选项] [路径]常用选项&#xff1a; -l&#xff1a;以长格式显示文件详细信息&#xff08;权限、所有者、大小、时间等&#xff09;。-a&#xff…...

        docker部署ELK,ES开启安全认证

        ES启动命令 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:8.17.0 es启动之后需要进入es容器&#xff0c;重置密码 elasticsearch-reset-password -u elastic -i 重置后的密码配置到kibana.yml中&#xff0c;启动kibana docker run …...

        ASP.NET MVC添加视图示例

        ASP.NET MVC高效构建Web应用- 商品搜索 - 京东 视图&#xff08;V&#xff09;是一个动态生成HTML页面的模板&#xff0c;它负责通过用户界面展示内容。本节将修改HelloWorldController类&#xff0c;并使用视图模板文件&#xff0c;以干净地封装生成对客户端的HTML响应的过程…...

        自动驾驶中的路径跟踪:Python实现与技术解析

        自动驾驶中的路径跟踪:Python实现与技术解析 一、路径跟踪是什么?为什么它至关重要? 路径跟踪(Path Tracking)是自动驾驶系统的关键部分之一,它负责确保车辆能够沿着预定义的轨迹行驶,同时稳定控制转向角度和速度。一个好的路径跟踪算法需要具备以下特点: 精准度:能…...

        前端面试题目-高频问题集合

        1.CSS里面水平垂直居中的方法 1.CSS里面水平垂直居中的方法弹性布局display: flex; /*先开启flex布局*/justify-content: center; /*实现水平居中*/jalign-items: center; /*实现垂直居中*/网格布局display: grid; /*先开启grid布局*/plac…...

        MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路

        MyBatis源码解析&#xff1a;从 Mapper 接口到 SQL 执行的完整链路 一、Mapper 代理对象的创建&#xff1a;sqlSession.getMapper(UserMapper.class)二、接口方法的执行&#xff1a;mapper.selectUser("coderzpw", 18)2.1 四大核心组件解析2.1.1 Executor&#xff08…...

        50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)

        &#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— FormWave组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 组件目标 构建一个美观、动态的登录表单&#xff0…...

        双目相机深度的误差分析(基线长度和相机焦距的选择)

        全文基于针孔模型和基线水平放置来讨论 影响双目计算深度的因素&#xff1a; 1、基线长度&#xff1a;两台相机光心之间距离2、相机焦距&#xff08;像素&#xff09;&#xff1a; f x f_x fx​&#xff08;或 f y f_y fy​&#xff09;为焦距 f f f和一个缩放比例的乘积。在…...

        Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py环境安装教程及图数据集制作

        最近需要训练图卷积神经网络&#xff08;Graph Convolution Neural Network, GCNN&#xff09;&#xff0c;在配置GCNN环境上总结了一些经验。 我觉得对于初学者而言&#xff0c;图神经网络的训练会有2个难点&#xff1a; ①环境配置 ②数据集制作 一、环境配置 我最初光想…...

        React---day6、7

        6、组件之间进行数据传递 **6.1 父传子&#xff1a;**props传递属性 父组件&#xff1a; <div><ChildCpn name"蒋乙菥" age"18" height"1,88" /> </div>子组件&#xff1a; export class ChildCpn extends React.Component…...