Kafka知识体系
一、认识Kafka
1. kafka适用场景
消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。
存储系统:kafka把消息持久化到磁盘上,以及多副本机制,极大的降低的数据丢失风险,可以把kafka当做长期的数据存储系统使用。
流式处理平台:kafka为主流的流式处理框架提供了完整的处理类库
2. kafka架构
producer、consumer、broker、zookeeper
其中broker可看做kafka服务节点/实例,一个服务器可以部署一个或多个broker,多个broker组成Kafka集群。
zookeeper集群负责管理broker集群元数据、控制器的选举等。
3.主题与分区
消息按主题(Topic)进行分类,一个主题可以有多个分区(partition),一个分区就是一个可追加的Log文件,每个消息都分配一个特定的offset。
但offset不跨分区,所以只能保证单个分区内消息的有序性。
一个主题的分区,可以在不同的broker上,这样就能实现水平扩展。
每个分区又有多副本机制,一主多从,这样就具备了一定的容灾能力。但一般主从数据有一定滞后性,所以理论上是有一定数据丢失风险。
可以设置参数控制主从副本的数据滞后范围,replica.lag.time.max.ms。该参数并不能保证从副本一定会在指定时间内赶上主副本,若是从副本未在设定时间内赶上主副本,则会被认定为“不同步”,提出ISR集合,不能参与选举(也可以设置参数OSR的也可以参与选举)。
4. 分区副本同步机制ISR、OSR、HW、LEO
Kafka分区leader节点选举一般是在ISR(in-sync replicas)集合中选择节点,该集合是在主从数据同步滞后范围内的节点,也就是滞后没那么多的节点。OSR则是滞后太多或失效的节点。
Kafka一个分区的所有副本,同步最少数据的分区的offset,就是HW(heigh watermark)高水位线。就是水桶原理,最低位置处就是这个水桶的最高的水位线。HW之前的消息才能被消费者可见。在消息同步复制机制下,HW之前的消息,才会被认为是消息发送成功,也就是所有副本都持久化到了该消息。异步消息复制机制下,leader副本持久化了该消息即返回消息接收成功的ack。
但同步复制会极大影响性能,所以在异步复制下,kafka依靠ISR机制,容忍一定的复制滞后范围,权衡了性能和数据可靠性之间的关系。
二、生产者
1. 消息发送三种模式
即发即忘(fire-and forget)、同步(sync)、异步(async)
KafkaProducer的send方法返回Future对象,使用get()方法实现同步发送。
通过指定Callback实现异步发送。
public Future send(ProducerRecord rescord,CallBack callback)
2. 分区器
分区器是Kafka为消息分配分区的功能,若发送消息时ProducerRecord中没有指定partition,则使用默认分区器,若有消息有key,则对key做hash,在可用分区中选择,若没有key,则轮询所有分区。
分区器可以自定义,实现Partitioner,在生产者props中配置即可。
3. 生产者架构
生产者有两个线程,主线程负责创建消息及对消息做拦截、序列化、设置分区,打包到缓存批次里,被sender线程拉取走。
sender线程负责创建消息请求,发送消息、缓存已发送还未响应的消息及响应消息。
4. 生产者重要参数
acks:指定分区中必须有多少副本接收到,才算消息接收成功。1-leader副本接收成功即认为成功。0-不需要等待服务端响应。-1/all-全部副本接收成功才算成功。该参数为0性能最佳,可靠性最低,为-1可靠性最佳,性能最低。为1则是性能与可靠性的这种方案。
max.request.size:请求消息的最大值,默认1MB。
retries、retry.back.off.ms:重试次数与重试间隔时间
linger.ms:生产者发送ProducerBatch之前,等待更多消息加入的时间。默认为0 不等待,放大则会降低消息时效性,但提升吞吐量。
request.timeout.ms:生产者等待消息响应的超时时间。
三、消费者
1.消费者组合和消费者
kafka一个主题可以有多个消费者组,每个消费者组可以有多个消费者。
各个消费者组之间是独立的,同一个消息可以被多个消费者组消费。
一个消息在一个消费者组中,只能被一个消费者消费。
每个消费者组group.id唯一。
2.消费者和分区
一个主题可以有多个分区,每个分区都按一定策略均衡的分配给消费者进行订阅。
消费者数量若等于分区数量,1对1均衡分配。消费者数量小于分区数量,则消费者会分配多个分区。
但若消费者数量大于分区数量,则多出来的消费者不会被分配任何分区。所以消费者数量应小于等于分区数量。
3.投递模式
点对点(p2p):利用消费者组概念,所有消费者都在一个组内,实现一个消息只有一个消费者。
发布/订阅(pub/sub):利用消费者组概念,所有消费者在不同组中,实现广播效果。
4.消息消费及位移提交
使用poll(Duration)方法批量拉取到ConsumerRecords消息,此时主题中会记录最新消息被消费的位置lastConsumedOffset,以及下一个被拉取的位置position。当前拉取批次消息被消费完,则自动提交消费位移commited offset。
lastConsumedOffset到position之间的消息,就是正在被消费但还没提交位移的消息。消息消费完提交位移commitedOffset,则lastConsumedOffset变为最新位置
消费完成,位移提交
消费位移不仅可以自动提交,也可以手动提交。同步、异步,有参无参。commitSync、commitAsync方法。
5.消息重复及丢失
正是因为需要消费端提交位移,所以就可能出现某种原因导致未提交位移,消费者再次拉取,还是从上次拉取的位置开始,造成消息重复消费。所以用户需要做好幂等措施,kafka无法保证消息不重复。
又如果消费端拉取消息和处理消息是不同线程,或者异步提交位移。在已提交位移,但应用突然挂掉,导致消息丢失。所以需要在消息提交位移前用户自行缓存消息内容及消息处理状态,处理消息丢失后的重新消费逻辑。
6.消息回溯
若消息丢失,可以使用seek方法,指定分区及offset进行消息回溯,重新消费。
或者设置auto.offset.reset参数,从某个位置重新开始消费。
但有时候消息丢失了,也不一定依赖消息中间件处理。比如转账指令,指令消息发送方发送完转账消息,会对进行对账处理,也就是查询消息指令对应的业务指令状态,是否为已受理,过了一天转账指令仍然未被受理,则认为该消息未被消费、消费异常或者消息携带的业务数据有问题,则重新发起转账指令(消费端需做幂等校验)。
7.再均衡
再均衡是增减分区和消费者时,分区和消费者订阅关系再分配的行为。实现分区和消费者的可扩展性。
再均衡期间消费者是被暂停拉取到消息的,也不能提交位移。所以会导致消息重复消费问题。应当尽量避免。
或做好消息幂等。
再均衡有监听器:
1、再均衡开始前消费者停止拉取消息之后监听,可用于提交消费位移。
2、再均衡结束后,消费者拉取之前监听,可用于
8.拦截器
拦截消息消费之前(过滤过期消息)、位移提交之前(记录位移)
未完待续...
相关文章:
Kafka知识体系
一、认识Kafka 1. kafka适用场景 消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统:kafka把消息持久化到磁盘上,…...
Micopython与旋转按钮(Encoder)
一、 encoder.py文件 CLK pin attached to GPIO12DT pin attached to GPIO13GND pin attached to GND 旋转编码器s1->CLK s2->DTimport time from rotary_irq_esp import RotaryIRQ r = RotaryIRQ(pin_num_clk=12, #clk引脚 pin_num_dt=13, #dat…...
联想Lenovo SR650服务器硬件监控指标解读
随着企业IT架构的复杂性和业务需求的增长,服务器的稳定运行变得至关重要。联想Lenovo SR650服务器以其高性能和稳定性,在各类应用场景中发挥着关键作用。为了保障服务器的稳定运行,监控易作为一款专业的IT基础设施监控软件,为联想…...
RAG数据拆分之PDF
引言RAG数据简介PDF解析方法及工具代码实现总结 二、正文内容 引言 本文将介绍如何将RAG数据拆分至PDF格式,并探讨PDF解析的方法和工具,最后提供代码示例。 RAG数据简介 RAG(关系型属性图)是一种用于表示实体及其关系的图数据…...
基于STM32的传感器数据采集系统设计:Qt、RS485、Modbus Rtu协议(代码示例)
一、项目概述 项目目标与用途 本项目旨在设计并实现一个基于STM32F103RCT6微控制器的传感器数据采集系统。该系统通过多个传感器实时监测环境参数,并将采集到的数据传输至上位机进行处理和分析。系统的主要应用领域包括环境监测、工业控制、智能家居等。通过该系统…...
【计网不挂科】计算机网络——<34道经典简述题>特训
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 本章为分章节的习题内容题库&#x…...
Spring Web开发(请求)获取JOSN对象| 获取数据(Header)
大家好,我叫小帅今天我们来继续Spring Boot的内容。 文章目录 1. 获取JSON对象2. 获取URL中参数PathVariable3.上传⽂件RequestPart3. 获取Cookie/Session3.1 获取和设置Cookie3.1.1传统获取Cookie3.1.2简洁获取Cookie 3. 2 获取和存储Session3.2.1获取Session&…...
算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
第六章 二叉树part08 今日内容: ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的…...
【论文阅读】 Learning to Upsample by Learning to Sample
论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程(1)初步设计(2)第一次修改(3)第二次修改(4)第三次修改 六、DySample四种变体七、复…...
Android 图形系统之五:Gralloc
Gralloc (Graphics Allocator) 是 Android 系统中的关键组件之一,用于管理图形缓冲区的分配、映射以及处理。在 Android 的图形架构中,Gralloc 充当了 HAL (Hardware Abstraction Layer) 的一部分,为系统和硬件提供了通用的接口,使…...
【大数据学习 | Spark调优篇】Spark之内存调优
1. 内存的花费 1)每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实…...
Spring Data JPA(一) 基础入门
Spring Data JPA(一) 基础入门 JPA 的全称是 Java Persistence API , 即 Java 持久层 API。Spring Data JPA 是 Spring 生态中提出的一套数据库 ORM (对象关系映射)规范、抽象标准,或者说它是对ORM框架实现的顶层抽象…...
Flutter | 基于函数式编程的通用单选列表设计
背景 项目中多次用到如下图的通用单选列表页: 常规封装 此列表需要三样东西: 标题数组当前选中项的 index点击 cell 的回调 封装大体如下: import package:flutter/material.dart;class ListPage1 extends StatefulWidget {const ListPa…...
华三防火墙F1000-AK系列策略路由配置案例(WEB)
1 配置需求或说明 1.1 适用的产品系列 本案例适用于如F1000-AK180、F1000-AK170等F1000-AK系列的防火墙。 1.2 配置需求及实现的效果 防火墙作为网络出口设备,外网有移动和联通两条线路。内网有192.168.1.0和192.168.2.0两个网段,需要实现192.168.1.0网段走移动线路,192…...
Oracle 锁表的解决方法及避免锁表问题的最佳实践
背景介绍 在 Oracle 数据库中,锁表或锁超时相信大家都不陌生,是一个常见的问题,尤其是在执行 DML(数据操作语言)语句时。当一个会话对表或行进行锁定但未提交事务时,其他会话可能会因为等待锁资源而出现超…...
深度学习中的生成对抗网络(GAN)原理与应用
引言 生成对抗网络(Generative Adversarial Network,简称GAN)是由Ian Goodfellow等人在2014年提出的一种深度学习模型,它通过对抗训练的方式生成与真实数据分布相似的假数据。GAN的出现极大地推动了深度学习和生成模型的研究&…...
Swing中JScrollPane面板
一、介绍 在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容的情况,这时可使用JScrollPane面板。JScrollPane面板是带滚动条的面板,是一种容器,但是JScrollPane只能放置一个组件,并且不可使用布局…...
【学习笔记】检测基于RTOS的设计中的堆栈溢出-第2部分
有许多技术可用于检测堆栈溢出。有些使用硬件,而有些则完全在软件中执行。正如我们很快将看到的那样,在硬件中具有这种能力到目前为止是更可取的,因为堆栈溢出可以在发生时立即检测到,事实上,可以避免,因为硬件实际上可以防止对无效访问的写入。 硬件堆栈溢出检测机制通…...
PHP 函数
在php中有非常多的函数,函数这种东西不需要记全,直到怎么使用就行了,如果想了解多点函数,可以查看php官方函数手册,或者参考菜鸟PHP 5 Array 函数 | 菜鸟教程。 创建 PHP 函数 通常函数创建完毕后是用来调用。 语法格…...
centos更换源文件,换源,替换源
期初怎么折腾就是不行,换了源也是不能使用的,最后发现不是换的源不行,而是之前的源文件不行,然后给所有的源文件在yum源统一放在了bak目录下,随后我们再去下载安装源文件。 您将yum源下载之后,先将您的其他…...
【深度学习】四大图像分类网络之VGGNet
2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发了新的卷积神经网络,并命名为VGGNet。VGGNet是比AlexNet更深的深度卷积神经网络,该模型获得了2014年ILSVRC竞赛的第二名,…...
线性表-链式描述(C++)
链式实现的线性表: 链式实现的线性表,即链表(Linked List),是一种通过节点(Node)的集合来存储数据的线性数据结构。在链表中,每个节点包含两部分:存储数据的域ÿ…...
C++高阶算法[汇总]
(一)高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中,标准数据类型通常有固定的位数和精度限制,而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 (二&#x…...
机器学习之DeepMind推出的DreamerV3
开放域任务强化学习(Open-Ended Task Reinforcement Learning)的目标是使智能体能够在多样化且未见过的任务中表现出色,同时能够实现任务间的迁移学习。这类研究的重点在于开发通用的学习算法,能够在没有明确任务定义的情况下,从环境中学习并推广到新任务。DeepMind的Drea…...
【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话
文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式:独立模式(standalone)和仲…...
Vue 集成和使用 SQLite 的完整指东
1. 引言 SQLite 是一种轻量级的关系型数据库管理系统,以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中,尤其是前端应用开发中,SQLite 可以作为客户端本地存储的一种选择,为用户提…...
CMAKE常用命令详解
NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...
【嵌入式——QT】QT制作安装包
第一步 QT程序写好之后,编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令,回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...
JavaScript 前端开发:从入门到精通的奇幻之旅
目录 一、引言 二、JavaScript 基础 (一)变量与数据类型 (二)运算符 (三)控制结构 三、函数 (一)函数定义与调用 (二)函数作用域 (三&am…...
shell编程基础笔记
目录 echo改字体颜色和字体背景颜色 bash基本功能: 运行方式:推荐使用第二种方法 变量类型 字符串处理: 条件判断:(使用echo $?来判断条件结果,0为true,1为false) 条件语句&a…...
FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…...
使用 PDF API 合并 PDF 文件
内容来源: 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户,该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...
Jenkins Nginx Vue项目自动化部署
目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置(构建后发送邮件) 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...
python代码实现问卷星问卷内容获取并写入word文档保存
以下附完整代码。 import os from tkinter import Tk, simpledialog, messagebox from docx import Document import time import requests import re from tkinter import ttk# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接 root Tk() root.title("问卷…...
C# 2024年Visual Studio实用插件集合
在2024年,Visual Studio作为.NET开发者的首选IDE,其插件生态不断壮大,为开发者提供了更高效、便捷的开发体验。本文将介绍一些实用的Visual Studio插件,特别是针对C#开发者,帮助提升开发效率和代码质量。 1. GitHub C…...
基于PHP的香水销售系统的设计与实现
摘 要 时代科技高速发展的背后,也带动了经济的增加,人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中,给对方留下良好地第一印象的产品,在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大ÿ…...
QT去除窗口边框(无边框)
ch21_TencentMeetingLogin::ch21_TencentMeetingLogin(QWidget *parent): QDialog(parent) {ui.setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//去除窗口边框 } 但此时窗口不能拖动且点击任务栏程序图标不能最小化! this->setWindowFlags(Q…...
【k8s】监控metrics-server
metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标,通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...
「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)
Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文将展示如何为不…...
EditInPlace就地编辑:Dom vs Form
利用Dom和Form实现就地编辑(EditInPlace)功能,两者在实现方式、用户体验和适用场景上有一些区别。下面我将详细解释这些区别: 1. EditInPlace 就地编辑(EditInPlace)是一种用户界面设计模式,允…...
【SCT63142FIB】15W高集成、高效率的无线功率发射PMIC
SCT63142FIB 15W高集成、高效率的无线功率发射PMIC 描述 SCT63142是一款高度集成的电源管理IC,可实现符合WPC规范的高性能,高效率和成本效益的无线电源发送系统,支持高达15W的功率传输,可与无线应用特定控制器或基于通用MCU的发送…...
STM32F4系列单片机新玩法---Micropython--pyBoard
只需要更改main.py文件的内容即可,例程CRTLV 1、流水灯: # main.py -- put your code here! import pyb while(1): for n in range(1,5) ledpyb.LED(n) led.on() pyb.delay(1000) led.off() 2、灯条,可以改变delay值来凸显效果…...
MFC中如何在工具条动态增加菜单
在C:\temp\VCSamples-master\VC2010Samples\MFC\Visual C 2008 Feature Pack\WordPad 这个例子中倒是有在工具条上动态增加菜单的方法,但有个缺陷,必须预先将需要的按钮定死。现将方法总结如下: 效果如下:点击前: 点击…...
行为型模式-迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,主要用于提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露其内部表示。这个模式常被用于集合类对象(如列表、数组、图等)的实现中。 模式结构…...
SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo
上一章讲了 请求书(发票)的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章,讲了下图里面的返品传票: SAP SD学习笔记14 - 投诉处理1 - 返品处理(退货处理)的流程以及系统实操&#…...
digit_eye开发记录(3): C语言读取MNIST数据集
在前两篇,我们解读了 MNIST 数据集的 IDX 文件格式,并分别用 C 和 Python 做了 读取 MNIST 数据集的实现。 基于 C 的代码稍长,基于 Python 的代码则明显更短,然而它们的共同特点是:依赖了外部库: 基于 C …...
快速学习GO语言总结
干货分享,感谢您的阅读!备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 …...
开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4
目录 一、FFmpeg是什么二、安装FFmpeg(windows)三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具,它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...
Python面试实战:高效处理海量日志,找出高频IP
Python面试实战:高效处理海量日志,找出高频IP 问题描述 在处理海量服务器日志时,一个常见的需求是统计出现次数最多的IP地址。这不仅有助于分析网站访问流量,还能为安全监控提供有价值的信息。然而,当日志文件过大,无法一次性加载到内存时,如何高效地解决这个问题就成…...
基于Java Springboot蛋糕订购小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...