Kafka·Producer

ops/2024/9/23 9:31:17/

Producer发送原理

  1. 拦截器进行拦截
    在这里插入图片描述

  2. 对key和value进行序列化
    org.apache.kafka.clients.producer.KafkaProducer#doSend
    在这里插入图片描述

  3. 分区选择
    计算消息要发送到topic的哪个分区上
    在这里插入图片描述
    在这里插入图片描述

    • 若指定了分区,则使用指定的值
    • 没有指定的话则使用分区器计算得到
    • 或者使用hash取余的方式
  4. 暂存消息到累加器
    Producer并不会立刻发送消息到Broker中,而是把消息暂存到累加器中,当消息达到一定量后,再异步批量发送
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    消息被暂存到这样一个结构中,可以看到每个topic中,按照分区将消息暂存到一个Deque中
    在这里插入图片描述在这里插入图片描述

  5. acks
    acks,消息发送后的确认机制

    • acks = 0:发送即确认
    • acks = 1:消息在leader落盘后确认
    • acks = all/-1:默认值,leader等待其他follower(ISR中的follower)都同步后回复确认
  6. 重试

  7. 幂等性
    开启幂等性配置(enable.idempotence默认true)后,生产者发送消息时,除了key-value,还会发送PID和Sequence Number。

    • PID:用来标识生产者
    • Sequence Number:表示消息的序列号,每次发送消息都会+1产生新的序列号(连续)

    也就是说PID和Sequence Number会跟随key-value一并先暂存于累加器中,最后发送到Broker中,当broker应答异常,Producer会进行重试发送

    消息发送到Broker后,虽然由于某些原因造成了生产者重试发送消息,但前一条消息可能已经成功落盘到Broker了,当重试发送的消息到达broker后,会通过PID和Sequence Number来判断

    • 若本次消息的Sequence Number 小于或等于 上一次消息的Sequence Number,说明消息重复,丢弃本次消息
    • 若本次消息的Sequence Number 大于 (上一次消息Sequence Number+1),说明存在消息丢失现象,然后抛异常

    虽然是否开启幂等性是在Producer配置的,但是幂等性是在broker中解决的(在Broker中判断PID和Sequence Number)


http://www.ppmy.cn/ops/101132.html

相关文章

springboot后端开发-自定义参数校验器

背景 在使用springboot进行后端开发的时候,经常会遇到数据校验的问题, 有时候可能默认的校验器不足以满足自己的需求, 这个时候就需要开发一个自己的校验器 在 Spring Boot 中自定义参数校验器通常涉及以下几个步骤: 1. 定义注解…

基于STM32开发的智能宠物喂食系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化定时器配置与喂食控制OLED显示与喂食状态提示Wi-Fi通信与远程控制应用场景 宠物自动喂食管理长时间外出的远程宠物喂食常见问题及解决方案 常见问题解决方案结论 1. 引言 对于宠物…

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

Java学习第三天

总体三部分内容:数据类型转换、运算符使用、调用Java提供的程序 数据类型转换: 1.自动类型转换 类型范围小的可以直接转换给类型范围大的变量;例如int类型可以直接赋值为long型 int a 10; long b a; char字符型在计算机底层是一个数字…

架构师面试题系列之Mybatis面试专题及答案(36题)

目录 1、什么是 MyBatis?2、讲下 MyBatis 的缓存3、Mybatis 是如何进行分页的?分页插件的原理是什么?4、简述 Mybatis 的插件运行原理,以及如何编写一个插件?5、Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一6、#{}和${}的区别是什么?7、为什么说 Mybatis 是…

AI辅助编码在主流IDE中的智能代码补全说明

AI辅助编码在主流IDE(集成开发环境)中的智能代码补全和生成功能已经成为现代软件开发不可或缺的一部分,它们显著提高了开发效率和代码质量。以下是几个主流IDE中智能代码补全和生成功能的对比: 1. IntelliJ IDEA 智能代码补全&a…

PCIe学习笔记(27)

Link Status Dependencies(链路状态依赖关系) DL_Down状态下的事务层行为 DL_Down状态表示链路上没有与其他组件的连接,或者与其他组件的连接已经丢失,并且无法通过物理层或数据链路层恢复。本节指定了当DPC未被触发并且数据链路…

AI for Genomics丨空间转录组数据表征算法 SPACE,基因组学的人工智能应用

在「Meet AI4S」系列直播第二期中,我们有幸邀请到了清华大学生命科学学院张强锋实验室博士后李雨哲, 他所在的张强锋实验室属于清华大学生命科学学院,同时也是清华-北大生命科学联合中心、北京结构生物学高精尖创新中心的重要组成部分。实验室…