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

大数据 笔记

kafka

kafka作为消息队列为什么发送和消费消息这么快?

  • 消息分区:不受单台服务器的限制,可以不受限的处理更多的数据
  • 顺序读写:磁盘顺序读写,提升读写效率
  • 页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问
  • 零拷贝:减少上下文切换及数据拷贝
  • 消息压缩:减少磁盘IO和网络IO
  • 分批发送:将消息打包批量发送,减少网络开销


 

消息丢失

一、生产者端防丢失
  1. ​使用带回调的发送API​
    • 避免使用producer.send(msg),改用producer.send(msg, callback),通过回调确认发送结果。
  2. ​配置重试机制​
    • 设置retries > 0(如3),自动重试因网络抖动导致的发送失败。
  3. ​设置高可靠性参数​
    • acks=all:确保Leader和所有ISR副本都持久化消息后才返回确认。
二、Broker端防丢失
  1. ​禁用非同步Leader选举​
    • 设置unclean.leader.election.enable=false,防止落后副本成为Leader导致数据丢失。
  2. ​多副本冗余​
    • replication.factor >= 3:至少3个副本存储消息。
  3. ​最小同步副本数​
    • min.insync.replicas > 1(如2),确保消息写入多个副本才视为成功。
    • 需满足replication.factor > min.insync.replicas(如3副本+2最小同步)。
三、消费者端防丢失
  1. ​关闭自动提交位移​
    • 设置enable.auto.commit=false,改为手动提交位移。
  2. ​同步+异步组合提交
try {while (true) {ConsumerRecords<String, String> records = consumer.poll();process(records); // 处理消息consumer.commitAsync(); // 异步提交(非阻塞)}
} catch (Exception e) {handle(e);
} finally {consumer.commitSync(); // 最终同步提交(确保位移正确)consumer.close();
}

如何解决消息积压问题

消息积压会导致很多问题,⽐如磁盘被打满、⽣产端发消息导致kafka性能过慢,最后导致出现服务雪崩不可用,解决方案如下:

  • 如果是Kafka消费能力不足,则可以考虑增加Topic的分区数,并且同时提升消费组的消费者数量,消费者数 = 分区数。因为主题的一个分区只能被消费者组中一个消费者消费,假如我们消费者组里有3个消费者,但是主题就一个分区,这就白白空着两个消费者无所事事。如果已经是多个消费者对应多个分区了,还是消费比较慢,就说明是消息消息的代码逻辑过重处理过慢,可以引入多线程异步操作,但这时候需要自己控制代码逻辑来保证消费的顺序性,因为一个分区内的消息是有序的,被一个消费者顺序消费,但是当消费者开启多线程处理之后就不能保证顺序消费了。
  • 如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间 < 生产速度),使处理的数据小于生产的数据,也会造成数据积压。比如说可以从一次最多拉取500条,调整为一次最多拉取1000条。简单来说就是在消费能力跟得上的同时,尽量保证消费速度>生产速度,这样就不会堆积了。

重复消费

生产者幂等性(enable.idempotence=true)​
  • ​原理​​:Kafka通过Producer ID (PID)Sequence Number实现。每个生产者初始化时分配唯一PID,每条消息携带递增序列号。Broker会校验序列号,拒绝重复消息
props.put("enable.idempotence", "true");
props.put("acks", "all");  // 必须配合acks=all

消费者手动提交Offset​

  • ​问题​​:自动提交可能导致消息处理未完成但Offset已提交,引发重复消费
  • ​解决方案​​:
    • ​同步提交​​:确保Offset提交成功后再处理下批数据,但阻塞性能
    • ​异步提交​​:非阻塞但可能失败,需结合重试机制
props.put("enable.auto.commit", "false");
consumer.commitSync();  // 或commitAsync()

Redis

持久化

AOF日志(存操作命令,比较完整,文件较大),RDB快照(存二进制数据,比较快,文件较小)

AOF:

Redis 是先执行写操作命令后,才将该命令记录到 AOF 日志里的,这么做有两个好处。

1.避免额外的检查开销。因为如果先将写操作命令记录到 AOF 日志里,再执行该命令的话,如果当前的命令语法有问题,那么如果不进行命令语法检查,该错误的命令记录到 AOF 日志里后,Redis 在使用日志恢复数据时,就可能会出错。

2.不会阻塞当前写操作命令的执行.因为当写操作命令执行成功后,才会将命令记录到 AOF 日志。

写回:在redis.conf配置文件中的appendfsync配置项可以有以下3种参数可:填

Always,Everysec,No,无法同时兼顾“主进程阻塞”和“减少数据丢失”

RDB:

save 是在主线程生成RDB文件,会阻塞主线程

bgsave 会创建一个子进程来生成RDB文件,这样可以避免主线程的阻塞

另外在执行过程中,reids依然可以继续处理操作命令,因为是“写时复制”(fork

什么是缓存雪崩、缓存击穿、缓存穿透

1缓存雪崩

​原因​​:

  • 大量缓存数据​​同时过期​
  • Redis​​集群宕机​

​应对方法​​:

  • ​数据过期​​:
    • 均匀设置过期时间(加随机值)
    • 互斥锁(单线程重建缓存)
    • 后台线程定时更新缓存(不设过期时间)
  • ​集群宕机​​:
    • 服务熔断/限流(保护数据库)
    • 构建Redis高可用集群(主从切换)

2. 缓存击穿

​原因​​:

  • ​热点数据突然过期​​,大量请求直接击穿到数据库

​应对方法​​:

  • 互斥锁(防止并发重建)
  • 热点数据永不过期 + 后台异步更新

3. 缓存穿透

​原因​​:

  • 请求的数据​​既不在缓存也不在数据库​​(恶意攻击或误删)

​应对方法​​:

  • 接口校验(过滤非法请求)
  • 缓存空值/默认值
  • 布隆过滤器(快速判断数据是否存在)

​核心区别​​:

  • 雪崩/击穿:数据​​最终存在​​,但缓存失效导致数据库压力。
  • 穿透:数据​​根本不存在​​,需拦截无效请求。

缓存与数据库两者的数据不一致

1 先更新数据库再删除缓存  策略

读操作:先读缓存,缓存命中直接返回,缓存没有命中,读数据库,先返回给缓存,再返回给用户。

写操作:更新数据库,然后删除缓存

2 先更新数据库再更新缓存  策略

在更新缓存前先加个分布式锁,保证同一时间只运行一个请求更新缓存,就会不会产生并发问题了,当然引入了锁后,对于写入的性能就会带来影响。

在更新完缓存时,给缓存加上较短的过期时间,这样即时出现缓存不一致的情况,缓存的数据也会很快过期,对业务还是能接受的。

相关文章:

大数据 笔记

kafka kafka作为消息队列为什么发送和消费消息这么快&#xff1f; 消息分区&#xff1a;不受单台服务器的限制&#xff0c;可以不受限的处理更多的数据顺序读写&#xff1a;磁盘顺序读写&#xff0c;提升读写效率页缓存&#xff1a;把磁盘中的数据缓存到内存中&#xff0c;把…...

js中encodeURIComponent函数使用场景

encodeURIComponent 是 JavaScript 中的一个内置函数&#xff0c;它的作用是&#xff1a; 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它&#xff1f; URL 中有一些字符是有特殊意义的&#xff0c;比如&#xff1a; ? 用来开始查询参数 & 分隔多个参数 连接…...

iOS工厂模式

iOS工厂模式 文章目录 iOS工厂模式简单工厂模式&#xff08;Simple Factory&#xff09;工厂方法模式&#xff08;Factory Method&#xff09;抽象工厂模式&#xff08;Abstract Factory&#xff09;三种模式对比 简单工厂模式&#xff08;Simple Factory&#xff09; 定义&am…...

【数据库】-1 mysql 的安装

文章目录 1、mysql数据库1.1 mysql数据库的简要介绍 2、mysql数据库的安装2.1 centos安装2.2 ubuntu安装 1、mysql数据库 1.1 mysql数据库的简要介绍 MySQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;目前…...

【缓存】JAVA本地缓存推荐Caffeine和Guava

&#x1f31f; 引言 在软件开发过程中&#xff0c;缓存是提升系统性能的常用手段。对于基础场景&#xff0c;直接使用 Java集合框架&#xff08;如Map/Set/List&#xff09;即可满足需求。然而&#xff0c;当面对更复杂的缓存场景时&#xff1a; 需要支持多种过期策略&#x…...

Prometheus的服务命令和配置文件

一、Prometheus的服务端命令和启动方式 1.服务端命令&#xff08;具体详情可以--help查看&#xff09; --config.file“prometheus.yml”指定配置文件&#xff0c;默认是当前目录下的prometheus.yml--web.listen-address"0.0.0.0:9090"web页面的地址与端口&#xf…...

物流项目第五期(运费计算实现、责任链设计模式运用)

前四期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 物流项目第四期&#xff08;运费模板列…...

前端JavaScript-嵌套事件

点击 如果在多层嵌套中&#xff0c;对每层都设置事件监视器&#xff0c;试试看 <!DOCTYPE html> <html lang"cn"> <body><div id"container"><button>点我&#xff01;</button></div><pre id"output…...

X 下载器 2.1.42 | 国外媒体下载工具 网页视频嗅探下载

X 下载器让你能够轻松地从社交应用如Facebook、Instagram、TikTok等下载视频和图片。通过内置浏览器访问网站&#xff0c;它能自动检测视频和图片&#xff0c;只需点击下载按钮即可完成下载。去除广告&#xff0c;解锁本地会员&#xff0c;享受无广告打扰的下载体验。 大小&am…...

STM32 CAN CANAerospace

STM32的CAN模块对接CANAerospace 刚开始报错如下. 设备开机后整个CAN消息就不发了. USB_CAN调试器报错如下. index time Name ID Type Format Len Data00000001 000.000.000 Event 总线错误 DATA STANDARD 8 接收过程错误-格…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…...

服务器安装xfce桌面环境并通过浏览器操控

最近需要运行某个浏览器的脚本&#xff0c;但是服务器没有桌面环境&#xff0c;无法使用&#xff0c;遂找到了KasmVNC&#xff0c;并配合xfce实现低占用的桌面环境&#xff0c;可以直接使用浏览器进行操作 本文基于雨云——新一代云服务提供商的Debian11服务器操作&#xff0c;…...

Java设计模式之组合模式:从入门到精通(保姆级教程)

文章目录 1. 组合模式概述1.1 专业定义1.2 通俗解释1.3 模式结构2. 组合模式详细解析2.1 模式优缺点2.2 适用场景3. 组合模式实现详解3.1 基础实现3.2 代码解析4. 组合模式进阶应用4.1 透明式 vs 安全式组合模式4.2 组合模式与递归4.3 组合模式与迭代器5. 组合模式在实际开发中…...

Oracle 创建外部表

找别人要一下数据&#xff0c;但是他发来一个 xxx.csv 文件&#xff0c;怎么办&#xff1f; 1、使用视图化工具导入 使用导入工具导入&#xff0c;如 DBeaver&#xff0c;右击要导入的表&#xff0c;选择导入数据。 选择对应的 csv 文件&#xff0c;下一步就行了&#xff08;如…...

大语言模型 17 - MCP Model Context Protocol 介绍对比分析 基本环境配置

MCP 基本介绍 官方地址&#xff1a; https://modelcontextprotocol.io/introduction “MCP 是一种开放协议&#xff0c;旨在标准化应用程序向大型语言模型&#xff08;LLM&#xff09;提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

【软考向】Chapter 9 数据库技术基础

基本概念数据库的三级模式结构 数据模型E-R 模型关系模型各种键完整性约束 关系代数5 种基本的关系代数运算&#xff1a;并、差、笛卡儿积、投影和选择扩展的关系代数运算&#xff1a;交(Intersection)、连接(Join)、除(Division)、广义投影(Generalized Projection)、外连接(O…...

实战:Dify智能体+Java=自动化运营工具!

我们在运营某个圈子的时候&#xff0c;可能每天都要将这个圈子的“热门新闻”发送到朋友圈或聊天群里&#xff0c;但依靠传统的实现手段非常耗时耗力&#xff0c;我们通常要先收集热门新闻&#xff0c;再组装要新闻内容&#xff0c;再根据内容设计海报等。 那怎么才能简化并高…...

STM32单片机GUI系统1 GUI基本内容

目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中&#xff0c;emWin、LVGL、TouchGFX 和 Qt 是…...

从零开始学习three.js(21):一文详解three.js中的矩阵Matrix和向量Vector

一、三维世界的数学基石 在Three.js的三维世界里&#xff0c;所有视觉效果的实现都建立在严密的数学基础之上。其中向量&#xff08;Vector&#xff09; 和矩阵&#xff08;Matrix&#xff09; 是最核心的数学工具&#xff0c;它们就像构建数字宇宙的原子与分子&#xff0c;支…...

应届本科生简历制作指南

一、找一个专业的简历模板 首先&#xff0c;你需要访问 Overleaf 的官方网站&#xff0c;也就是Overleaf, Online LaTeX Editor&#xff0c;进入页面后&#xff0c;点击注册按钮&#xff0c;按照提示填写相关信息来创建一个属于自己的账号&#xff0c;通常需要填写用户名、邮箱…...

VUE3+TS实现图片缩放移动弹窗

完整代码 使用VUE3、TS&#xff0c;实现将图片通过鼠标拖拽缩放以及选择缩放比例。 <template><div><el-dialogv-model"dialogVisible"title"查看图片":close-on-click-modal"false":close-on-press-escape"false"fu…...

大语言模型训练数据格式:Alpaca 和 ShareGPT

在大规模语言模型&#xff08;LLM&#xff09;的开发中&#xff0c;训练数据的质量和格式起着至关重要的作用。为了更好地理解和构建高质量的数据集&#xff0c;社区发展出了多种标准化的数据格式。其中&#xff0c;Alpaca 和 ShareGPT 是两种广泛使用的训练数据格式&#xff0…...

实现动态增QuartzJob,通过自定义注解调用相应方法

:::tip 动态增加Quartz定时任务&#xff0c;通过自定义注解来实现具体的定时任务方法调用。 ::: 相关依赖如下 <!-- 用来动态创建 Quartz 定时任务 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-start…...

PyTorch可视化工具——使用Visdom进行深度学习可视化

文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…...

Qt无边框界面添加鼠标事件

在Qt中实现无边框窗口的鼠标事件处理&#xff0c;主要涉及窗口拖动和调整大小功能。以下是分步实现的代码示例&#xff1a; 1. 创建无边框窗口 首先&#xff0c;创建一个继承自QWidget的自定义窗口类&#xff0c;并设置无边框标志&#xff1a; #include <QWidget> #in…...

企业级爬虫进阶开发指南

企业级爬虫进阶开发指南 一、分布式任务调度系统的深度设计 1.1 架构设计原理 图表 1.2 核心代码实现与注释 分布式锁服务 # distributed_lock.py import redis import timeclass DistributedLock:def __init__(self, redis_conn):self.redis = redis_connself.lock_key = …...

Ubuntu ping网络没有问题,但是浏览器无法访问到网络

我这边是尝试清楚DNS缓存然后重新访问就可以了。 使用 resolvectl 刷新 DNS 缓存 在 Ubuntu 20.04 及更高版本中&#xff0c;可以使用以下命令来刷新 DNS 缓存&#xff1a; sudo resolvectl flush-caches 使用 systemd-resolve&#xff08;适用于旧版本&#xff09; 如果你…...

网络安全-等级保护(等保) 2-7 GB/T 25058—2019 《信息安全技术 网络安全等级保护实施指南》-2019-08-30发布【现行】

################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…...

数据结构实验10.1:内部排序的基本运算

文章目录 一&#xff0c;实验目的二&#xff0c;实验内容1. 数据生成与初始化2. 排序算法实现&#xff08;1&#xff09;直接插入排序&#xff08;2&#xff09;二分插入排序&#xff08;3&#xff09;希尔排序&#xff08;4&#xff09;冒泡排序&#xff08;5&#xff09;快速…...

C#:多线程

一.线程常用概念 线程&#xff08;Thread&#xff09;&#xff1a;操作系统执行程序的最小单位 进程&#xff08;Process&#xff09;&#xff1a;程序在内存中的运行实例 并发&#xff08;Concurrency&#xff09;&#xff1a;多个任务交替执行&#xff08;单核CPU&#xff0…...