深入Kafka client

分区分配策略

客户端可以自定义分区分配策略, 当然也需要考虑分区消费之后的offset提交, 是否有冲突。

消费者协调器和组协调器

a. 消费者的不同分区策略, 消费者之间的负载均衡(新消费者加入或者存量消费者退出), 需要broker做必要的协调。
b. Kafka按照消费组管理消费者, 鉴于offset提交最终都是在某个broker节点上完成。该broker扮演GroupCoordinator角色, 具体的选择则是通过hash快速定位。
c. client端存在一个ClientCoordinator与目标的GroupCoordinator进行通信实现最终协调;
d. 具体过程如下

ClientCoordinator Broker(Min Load) Broker(GroupCoordinator) Broker(To consumer) 1. Find_Coordinator request Find_Coordinator response 2. Join_Group request 3.1 calculate brokerId 3.2 Elect leader consumer 3.3 Elect partition strategy . Join_Group response, isLeader 4. Sync_Group Request Sync_Group Response 5. Poll offset/message, HeartBeat response offset/heartbeat/message ClientCoordinator Broker(Min Load) Broker(GroupCoordinator) Broker(To consumer)

关于__consumer_offset

__consumer_offset是一个特殊的topic, 用于存储每个topic中partition中client提交的offset。其中的数据保留时间通过offset.retention.minutes配置。如果consumer消费消息的间隔超过了配置时间, 则offset会丢失, consumer再次获取offset时会因为没有存量的offset而自动重置(auto.offset.reset)。该topic下的消息清理采用压缩策略(仅保留最新消息)。Kafka中会有定时清理任务清理过期的消费位移。

消息发送QoS

  1. at-least-once, 至少一次, 消息不会丢失, 但消息会重复;
  2. at-most-once, 至多一次, 消息不会重复, 但可能会丢失;
  3. exact-once, 恰好一次, 消息肯定被传输且只传输一次;(如果开发即时消息系统, 那么这个语义就是我们的目标)
    默认情况下, Kafka producer在发送时, 如果消息发送失败会自动进行重试, 重试过程可能会导致消息重复。而一旦发送成功, Kafka通过多副本机制保证消息一定会被保存。因此从consumer角度观察, producer发送的结果, 其QoS是at-least-once。如果需要exact-once, 则需要启用Kafka的幂等特性。

幂等

  1. 配置参数
    enable.idompotence=true
    retrics > 0
    max.in.flight.requests.per.connection <=5
    ack=-1

  2. 实现细节
    首先幂等是partition级别, broker端自动为producer分配一个PID, 并维护PID->分区(序列号 lastSeq) 的状态。当producer发送消息时, 必须携带该序列号newSeq。broker端收到消息时做校验:
    a. newSeq = lastSeq+1, broker接收;
    b. newSeq > lastSeq+1, 中间存在消息丢失, 抛出OutOfOrderException;
    c. newSeq < lastSeq+1, 消息存在重复, 直接丢弃即可.

事务消息

如果要实现跨parition的exact-once语义, 则需要基于事务消息。一般来说事务有ACID的特性, 但这个是数据库事务的通用场景。Kafka下消息需要考虑生产和消费, 这里的事务消息更多是生产端的事务消息。消费端可能会因为某些原因无法以事务的形式消费。比如:

  1. 对于采用日志压缩策略的主题而言, 事务中的消息被清理(对相同key的消息后写入的消息会覆盖之前写入的消息);
  2. 事务涉及的分区多个日志段, 如果老的日志分段被删除, 对应的消息也会消失;
  3. 消费者通过seek消费消息, 造成消息遗漏;
  4. 消费者在消费时没有消费到事务涉及的所有分区, 因此不能读取事务中的所有消息;
    总的来说, 事务保证了生产者可以以事务的方式实现消息发送的exact
    -once语义, 但消息清理和消费并未引入事务约束。

实现原理

  1. 开启幂等;
  2. 设置事务ID, transactional.id;
  3. 生产者通过事务ID得到PID和producer epoch, 进而实现跨生产者会话的消息发送和事务恢复。前者保证相同transactionId的生产者仅有1个可以有效发送消息, 后者保证如果事务消息发送后宕机新恢复出来的生产者可以继续提交或者终止事务。其中包含2个方面, 生产者的唯一性, 其关联的在途事务的可见性和可操作性。
  4. broker端为支持事务消息引入了事务协调器, 与组协调器类似, 用于处理事务的提交和终止。
  5. 具体交互流程如下
    发送事务消息交互细节

事务存储

  1. 日志存储按Topic, Partition和LogSegment层级存储, 事务消息也不例外;
  2. 与普通消息的区别是, 事务消息更多适用于发送一组消息的场景, 具体到LogSegment就是有一组连续的消息, 因此Kafka引入了ControlBatch消息来标志消息结束。
  3. 事务消息的开始在哪里呢? 严格来说, producer跨分区发送成功后, consumer是无法恢复出原有的顺序, 在分区级别仅可以做到与某个事务关联的一组消息(通过消息的属性标志是否为事务消息), 结束通过ControlBatch标志一组消息结束。

小结

本文讨论了Kafka发送消息的三种语义at-least-once, at-most-once, exact-once,并针对exact-once的单分区实现(幂等控制)和跨分区实现(事务消息)做简要介绍, 希望能帮助你梳理出Kafka broker端对消息发送QoS实现的基本脉络, 为进一步学习打基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HttpClient—详解、代码演示

简介&#xff1a;HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议&#xff0c;即可以通过HttpClient可以再Java中构建和发送Http请求。 …

将jar包打包为docker镜像

此记录一下将springboot项目的jar打包成docker镜像记录错误点。 1.将springboot项目打包成jar包 参考博客 : springboot项目打包成jar_springboot打包成jar-CSDN博客 具体打包步骤参考他的如何打包: 使用IDEA进行打包。但是我需要在我的springboot的pom.xml文件里面配置如下插…

javascript实现的星座查询

今天在这个网站http://xzxys.wiicha.com/看到查询星座幸运色的效果&#xff0c;想研究一下代码&#xff0c;结果右键禁用。后来参考了一下别人的代码&#xff0c;琢磨着先实现了一下星座查询的功能&#xff0c;输入月份和日期四位数后&#xff0c;可以查询属于哪个星座&#xf…

如何做代币分析:以 INJ 币为例

如何做代币分析&#xff1a;以 INJ 币为例 作者&#xff1a; lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;INJ 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作…

网络学习:MPLS技术基础知识

目录 一、MPLS技术产生背景 二、MPLS网络组成&#xff08;基本概念&#xff09; 1、MPLS技术简介&#xff1a;Multiprotocol Lable Switching&#xff0c;多协议标签交换技术 2、MPLS网络组成 三、MPLS的优势 四、MPLS的实际应用 一、MPLS技术产生背景 1、IP采用最长掩码…

跨地域传文件时 面临的安全、效率等问题要如何解决?

近年来&#xff0c;企业在异国、异地设立分支机构的越来越多&#xff0c;在日常经营中&#xff0c;企业总部和分支机构间存在平行、垂直及互相交叉的管理模式和业务往来需求&#xff0c;因此&#xff0c;大型企业存在必然的跨地域传文件场景&#xff0c;比如跨地理域文件交换、…

6个常见的动态内存的错误和动态内存经典笔试题

和黛玉学编程..........> 这篇的代码对应知识点就在上一篇啦 常见的动态内存的错误 对NULL指针的解引用操作 void test() { int *p (int *)malloc(INT_MAX/4); *p 20; free(p); } 如果P的值是空指针就会有问题&#xff0c;所以一般都会先进行判断 对动态开辟空间的越…

【无刷电机学习】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…

【leetcode】反转字符串 双指针

/*** param {character[]} s* return {void} Do not return anything, modify s in-place instead.*/ var reverseString function(s) {let start0;let ends.length-1;while(start<end){[s[start],s[end]][s[end],s[start]];start;end--;}return s;};双指针&#xff0c;一头…

ST32/GD32——UART串口通信

芯片选型 Ciga Device — GD32F470系列 串口通信 串口通信指的是通过串行通信接口进行数据传输的通信方式&#xff0c;通常用于短距离、低速率的数据传输。 串口通信可以使用不同的串行通信协议和接口&#xff0c;常见的串口通信协议有UART、USART、RS-232、RS-485、SPI、I…

Mybatis_plus-基础

一、简介 1.概述 文档地址&#xff1a;https://baomidou.com/ 概述&#xff1a;MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提…

解密Lawnchair:打造个性化极致的Android桌面体验

解密Lawnchair&#xff1a;打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具&#xff0c;旨在为用户提供个性化极致的桌面体验。作为一个开源项目&#xff0c;Lawnchair融合了简洁、灵活和强大的特点&#xff0c;让用户能够自由定制其Andro…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

1.线程池的实现机制

为什么使用线程池&#xff1f; 在处理并发问题时&#xff0c;倘若我们一个一个创建线程池再进行线程池的销毁&#xff0c;不但浪费资源还增加了上下文切换的开销。线程池主要是以空间来换取时间。 如图所示给任务队列分配在线程池里线程。 线程池用到的模式是半同步、半异步模…

机器学习 | 四大常用机器学习Python库介绍

今天这篇我们介绍下Python中常用的机器学习库(机器学习、深度学习啥的&#xff0c;小编还是建议使用Python进行建模编写哈)&#xff0c;也算是本公号机器学习的第一篇推文&#xff0c;主要内容如下&#xff1a; 机器学习常用四大Python库 关于机器学习的我想说的话 所有完整代…

mysql高可用架构设计

一、主从架构 1.主从复制 1.主从复制原理 Mysql的主从复制中主要有三个线程&#xff1a; master&#xff08;binlog dump thread&#xff09;、slave&#xff08;I/O thread 、SQL thread&#xff09; &#xff0c;Master一条线程和Slave中的两条线程。 整体上来说&#xff…

如何合理布局子图--确定MATLAB的subplot子图位置参数

确定MATLAB的subplot子图位置参数 目录 确定MATLAB的subplot子图位置参数摘要1. 问题描述2. 计算过程2.1 确定子图的大小和间距2.2 计算合适的figure大小2.3 计算每个子图的position数据 3. MATLAB代码实现3.1 MATLAB代码3.2 绘图结果 4. 总结 摘要 在MATLAB中&#xff0c;使用…

2024-简单点-picamera2除了文档还有哪里可以学习实例?

picamera2学习例子 去github的picamera2库&#xff0c;找app和examples目录&#xff0c;然后学习

重建大师实时建模支持华为的npu吗?

可以支持适配。重建大师推出信创版&#xff0c;可全面支撑国产信创环境。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格模型&#xff0c;可一…

NumpyPython 笔记1 3.4

array.ndim 几维 array.shape 几行&#xff0c;几列 array.size 存在多少个元素 np.array 转化为矩阵 dtype 确定类型&#xff0c;并且确定精度64&#xff1f;32&#xff1f;16&#xff1f;数字越小&#xff0c;越不精确 二维 np.zeros 生成零矩阵&#xff0c;并且规…