KafKa基本原理

分布式,分区,多副本,zk协调的分布式消息系统

使用

日志收集 消息系统 用户活动跟踪 运营指标

概念

Broker topic producer consumer consumergroup partition

通信基于tcp协议

很多集群信息记录在zk里保证自己的无状态,方便水平扩容

leader处理partition的读写请求,followers被动复制leader,不提供读写保证多副本与消费一致性

一个partition同一个时刻在一个consumer group中只能有一个consumer instance在消费

Controller

本身是broker

分区leader副本故障选新leader

分区isr集合变化通知broker更新元数据

topic增加分区数量,让新分区被其他节点感知

监听broker的变化

监听topic的变化

从zk获取topic, partition, broker信息,监听topic分区分配变化

更新集群元数据并同步到普通的broker中

启动broker再zk上创建/controller临时节点,成功的为Controller,挂掉重新选

Partition副本选leader机制

从isr列表选第一个broker作为leader

unclean.leader.election.enable 是否可以再isr以外的列表选

replica.lag.time.max.ms 与leader同步滞后的副本

消费者消费记录offset

consumer定期提交offset: _consumer_offset, key是consumerGroupId+topic+分区号,value是offset值,默认分配50个分区用于支持高并发

hash(consumerGroupId) % _consumer_offsets主题的分区数

消费者rebalance机制

消费组里消费者数量变化 消费分区数变化 消费组订阅了更多的topic

rebalance过程中,消费者无法从kafka消费消息

range、round-robin、sticky

Rebalance过程

选择分组协调器 提交offset的分区leader所在的broker

加入消费组 协调器选第一个加入group的consumer为leader(消费协调器,负责制定分区方案)

sync group 分区方案发给分组协调器,分组协调器下发给各个consumer

producer发布消息机制

写入方式 push append patition 顺序写

路由

指定patition

未指定patition但指定key, 通过key的value hash选出

patition和key都未指定,轮询

写入流程

zk的"/brokers/.../state" 节点找到该 partition 的 leader

发送消息

leader写入本地log

followers从leader pull消息,写入本地log返回ack

leader收到所有isr的replica的ack,增加HW并向producer发送ack

LEO & HW

每个partition的log最后一条Message的位置

一个partition对应的ISR中最小的LEO(log-end-offset)作为HW

日志分段存储

一个分区的消息数据在一个文件夹下,topic+分区号命名,消息分段存储

segment file最大1G

.index .log .timeindex

每次往分区发4K(可配置)消息就会记录一条当前消息的offset到index文件

每次往分区发4K(可配置)消息就会记录一条当前消息的发送时间戳与对应的offset到timeindex文件

数字表示日志段包含的起始offset

问题

消息丢失

min.insync.replicas配置备份个数

发送端 消费端

重复消费

发送端 消费端

乱序

发送端 消费端

消费者端接收到消息后将需要保证顺序消费的几条消费发到内存队列(可以搞多个),一个内存队列开启一个线程顺序处理

消息积压

修改消费端程序,让其将收到的消息转发到其他topic(可以设置很多分区),再启动多个消费者同时消费新主题的不同分区。

bug导致一直消费不成功,转发到其它队列里去(类似死信队列),后面再慢慢分析死信队列里的消息处理问题

延时队列

消息回溯

一般情况分区数跟集群机器数量相当就差不多了,实际靠压测

吞吐量的数值和走势还会和磁盘、文件系统、 I/O调度策略等因素相关

消息传递保障

at most once ,acks=0

at least once ,acks=-1

exactly once ,at least once+消费幂等

kafka生产者的幂等

生产者加上参数 props.put(“enable.idempotence”, true)

PID和Sequence Number和消息绑定,相同不再接收

每个新的 Producer 在初始化的时候会被分配一个唯一的 PID

Producer 发送到每个 Partition 的数据都有对应的序列号,从0递增

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python将HTML快速转换成PDF

大家好,在Web开发和报告任务中,将HTML内容转换为PDF是一种常见需求。Python作为一个庞大的生态系统,提供了各种库来完成这个任务。本文将指导完成使用Python将HTML转换为PDF的过程,包括一个示例实现和一个单元测试。我们将使用pdf…

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件(v2.0)

Python将已标注的两张图片进行上下拼接并修改、合并其对应的Labelme标注文件(v2.0) 前言前提条件相关介绍实验环境上下拼接图片并修改、合并其对应的Labelme标注文件代码实现输出结果 前言 此版代码,相较于Python将已标注的两张图片进行上下拼…

shopify 跨境电商网站开发

开发团队(5个人): Bobby:毕业于山西大学,软件工程专业,多年项目管理产品经理经验。 Alice:毕业于山西大学吕梁学院,信息于计算科学,多年前端开发经验。 Tiffany&#xff…

区块链的可扩展性研究【06】Plasma

1.Plasma:Plasma 是一种基于以太坊区块链的 Layer2 扩容方案,它通过建立一个分层结构的区块链网络,将大量的交易放到子链上进行处理,从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易,使得不同的区块…

每日一道算法题 8(2023-12-16)

题目描述 给定一个仅包含0和1的n*n二维矩阵 请计算二维矩阵的最大值 计算规则如下 每行元素按下标顺序组成一个二进制数(下标越大约排在低位), 二进制数的值就是该行的值,矩阵各行之和为矩阵的值 允许通过向左或向右整体循环移动每个元素来改变元素在行…

【面试】不使用中间变量,交换两个变量a和b的值

点评:典型的送人头的题目,通常交换两个变量需要借助一个中间变量,如果不允许使用中间变量,在其他编程语言中可以使用异或运算的方式来实现交换两个变量的值,但是Python中有更为简单明了的做法。 方法一: …

芯知识 | WT2003Hx系列高品质语音芯片MP3音频解码IC的特征与应用优势

在嵌入式语音领域,唯创知音WT2003Hx系列高品质语音芯片以其卓越的音频解码性能脱颖而出。本文将深入研究该系列芯片的特色与应用优势,重点关注其支持wav、Mp3格式音频解码、高品质播放等方面。 特色一:支持wav、Mp3格式音频解码 1.多格式兼…

【️Zookeeper是CP还是AP的?】

😊引言 🎖️本篇博文约3000字,阅读大约10分钟,亲爱的读者,如果本博文对您有帮助,欢迎点赞关注!😊😊😊 🖥️Zookeeper是CP还是AP的? ✅…

爬虫中HTTP请求库和requestsxiang详解

Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。 Requests 唯一的一个非转基因的 Pyth…

2024年20多个最有创意的AI人工智能点子

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 探索 2024 年将打造的 20 个基于人工智能产品的盈利创意 🔥🔥🔥 直到最近,企业对人工智能还不感兴趣,但…

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力,人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析? 视频分析或视频识别技术,是指从视频片段中提取有用信息…

存放redis异常Could not write JSON: Java 8 date/time type `java.time.LocalDateTime处理

1.首先需要maven引入 <dependency><artifactId>jackson-datatype-jsr310</artifactId><groupId>com.fasterxml.jackson.datatype</groupId><version>2.15.3</version></dependency>2.示例代码如下 private RedisTemplate<S…

Java设计模式-建造者模式

目录 一、需求 二、传统方法解决需求 三、基本介绍 四、注意事项和细节 一、需求 盖房项目需求 需要建房子&#xff1a;这一过程为打桩、砌墙、封顶 房子有各种各样的&#xff0c;比如普通房&#xff0c;高楼&#xff0c;别墅&#xff0c;各种房子的过程虽然一样&#xff…

RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 RabbitMQ时空之旅&#xff1a;rabbitmq_message_timestamp的奇妙世界 前言什么是rabbitmq_message_timestamprabbitmq_message_timestamp 的定义与作用&#xff1a;如何在 RabbitMQ 中启用消息时间戳&…

【每次启动wsl时自动更新ip】

每次启动wsl时自动更新ip 在windows中使用wsl时&#xff0c;每次启动wsl后发现其ip都会改变&#xff0c;这样的话如果想通过vscode的Remote-SSH插件打开代码编辑器&#xff0c;就需要手动更新ssh配置文件&#xff0c;极为不便&#xff0c;所以考虑使用一种优雅的方式&#xff0…

abc组合 C语言xdoj54

问题描述 已知abccban&#xff0c;其中a,b,c均为一位数&#xff0c;1000<n<2000,编程求出满足条件的a,b,c所有组合。 输入说明 一个整数n 输出说明 按照整数abc从小到大的顺序,输出a, b, c, 用空格分隔&#xff0c;每输出一组a&#xff0c;b&#xff0c;c后换…

计算三叉搜索树的高度 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 定义构造三又搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于节点的数加…

CGAL的3D网格参数化

1、介绍 参数化曲面相当于找到一个从合适的域到曲面的单射映射。一个好的映射是在某种意义上最小化角度失真&#xff08;保角参数化&#xff09;或面积失真&#xff08;等面积参数化&#xff09;的映射。在这个包中&#xff0c;我们专注于参数化与圆盘或球体同胚的三角化曲面&a…

Linux---重定向命令

1. 重定向命令的介绍 重定向也称为输出重定向&#xff0c;把在终端执行命令的结果保存到目标文件。 2. 重定向命令的使用 命令说明>如果文件存在会覆盖原有文件内容&#xff0c;相当于文件操作中的‘w’模式>>如果文件存在会追加写入文件末尾&#xff0c;相当于文件…

C++执行系统命令的三种方式

C 执行系统命令可以使用以下几种方法&#xff1a; 1. 使用 system() 函数 system() 函数会调用操作系统的命令行处理器&#xff08;如 /bin/sh&#xff09;来执行命令。该函数的语法如下&#xff1a; int system(const char *command);其中&#xff0c;command 参数指定要执…