自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1220)
  • 收藏
  • 关注

原创 Redis:IO多路复用深度解析

多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要 select 、 poll 、 epoll 来配合。多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。

2023-07-06 12:09:39 4582 2

原创 Spring 最佳实践:用 ObjectProvider 做可选注入,用 @Lazy 优化初始化

本文针对医院系统中常见的多院区部署和功能开关问题,提出两种Spring依赖注入优化方案。对于必选但初始化较重的组件(如医保结算SDK),建议使用@Lazy注解将初始化推迟到首次使用时;对于可选功能或存在多实现的场景(如报表导出器),推荐采用ObjectProvider实现运行时动态选择。文章通过挂号、报表和结算三个典型场景,详细对比了普通注入的错误用法与优化方案,并给出四条选择建议:必选不重用普通注入、必选重用@Lazy、可选功能用getIfAvailable()、多实现场景用stream()。这些方案能有

2026-02-27 15:53:12 637

原创 一文吃透 Redis 跳表层数:为什么是 log₄(N),以及 Level 4 / 5 何时出现

Redis ZSet 使用跳表作为有序结构,其层数由随机晋升决定(概率p=1/4),高度期望为log₄(N)。跳表是概率性结构,各层出现与否取决于元素规模(如Level 4在256元素时概率约63%)。Redis选择1/4概率而非1/2,以较少索引节点换取内存节省,保持O(log N)查询和O(N)空间复杂度。理解跳表需明确三点:随机性、期望高度和概率性层级分布。

2026-02-26 10:25:56 581

原创 如何用 FFmpeg 处理 PCM 音频 & 判断 PCM 文件到底是什么格式

本文介绍了PCM原始音频数据的基本概念和参数分析方法。PCM是不带头信息的原始音频采样数据,关键参数包括采样率、位深和声道数。文章详细讲解了如何通过FFmpeg将MP3转换为PCM,以及如何通过文件大小推算PCM文件的位深和采样率。最后提供了实用的FFmpeg命令总结,包括格式转换和参数验证方法,帮助开发者准确识别和处理PCM音频文件。

2026-02-13 17:20:17 865 1

原创 线程池满了怎么办?用 RabbitMQ 做任务补偿不丢失

线程池拒绝任务 → 自定义拒绝策略存证 + 投递 MQMQ 消费者重新提交线程池 → 最终任务一定被执行成功。这是最常用的异步任务高可用方案。

2026-02-01 15:30:16 802

原创 Base64 编码指南:原理、场景与代码实践

Base64是一种将二进制数据编码为ASCII文本的常用方法,使用64个可打印字符(A-Z,a-z,0-9,+/)表示数据。其原理是将每3字节(24位)数据拆分为4个6位单元,每个单元对应一个Base64字符,编码后数据量增加约33%。主要应用于文本协议传输二进制数据(如API、邮件附件)、前端资源内嵌(Data URL)、JWT令牌等场景。优点是兼容性强、实现简单,但存在体积膨胀、无加密性等局限。Java等语言提供原生支持,但不适合处理大文件或敏感数据。掌握Base64对开发者处理数据兼容性问题具有重要意

2026-02-01 14:20:08 895

原创 基于 MongoDB 的视频播放进度(断点续播)实现方案

本文介绍了如何利用MongoDB实现视频播放的断点续播功能。针对视频业务中高频写入、快速查询的需求,采用MongoDB文档模型存储用户播放进度,设计了包含用户ID、视频ID、播放秒数等字段的数据模型,并建立唯一索引保证查询效率。通过upsert操作实现播放进度的更新或插入,既保证了数据一致性又提升了性能。方案还包含前端上报规则优化、写压力降低等实践建议,适用于在线视频、课程学习等需要记录播放进度的场景,具有实现简单、性能稳定、易于扩展等特点。

2026-01-31 10:24:01 890

原创 理解 Dockerfile 中的 ENV LD_LIBRARY_PATH:为什么它对容器运行至关重要

本文解释了Dockerfile中设置LD_LIBRARY_PATH环境变量的作用。该配置用于指定Linux动态链接器查找动态库(so文件)的路径顺序,特别是在Java容器应用中调用本地SDK或JNI时尤为重要。默认搜索路径不包括应用自定义路径(如/app/lib),会导致程序报错。配置时需保留系统默认路径(/usr/lib等)以避免其他依赖库找不到的问题。文章通过实际案例说明这是确保JVM能正确加载动态库的必要配置,否则会出现"UnsatisfiedLinkError"等错误。

2026-01-30 11:28:52 705

原创 Dockerfile 的 EXPOSE 和 Docker Compose 的 ports 有什么区别?

摘要: Dockerfile中的EXPOSE仅声明容器内部服务监听的端口(如18010),属于元数据,不会自动开放端口到宿主机。而docker-compose.yml中的ports(如"18010:18010")才是真正的端口映射,将容器端口绑定到宿主机,使外部可访问。两者区别在于:EXPOSE仅作声明,ports实现实际映射。若要让服务对外可用,必须配置ports,仅写EXPOSE无效。最佳实践是同时在Dockerfile中EXPOSE声明端口,并在Compose文件中通过ports映

2026-01-30 11:13:42 715

原创 在 Windows 上安装本地 JAR 到 Maven 仓库

摘要:本文介绍了如何将本地JAR包手动安装到Maven本地仓库。当项目依赖未发布到远程仓库的第三方JAR包(如jna.jar和自定义examples.jar)时,可通过mvn install命令实现安装。文章提供了Windows CMD(单行命令)和PowerShell(多行命令)两种安装方式,并详细说明了pom.xml中添加依赖的方法。最后还介绍了在IntelliJ IDEA中刷新Maven依赖和打包项目的操作步骤,包括通过IDEA面板和命令行两种方式完成打包。

2026-01-30 10:25:57 452

原创 深入解析 Spring Boot 容器化部署:三种方式传递环境变量给 Docker(含 docker run、.env 与 docker-compose 示例)

本文介绍了三种在Docker容器中为Spring Boot应用注入环境变量的方法:1)通过docker run -e直接传递变量,适合临时测试;2)使用.env文件配合--env-file参数,便于集中管理敏感配置;3)在docker-compose.yml中定义environment,适合多容器部署。所有方式都遵循Spring Boot的配置优先级规则:优先读取环境变量,未设置则使用配置文件默认值。建议生产环境避免硬编码敏感信息,采用.env文件或Docker Secrets管理密码等数据,实现安全灵活的

2026-01-29 18:02:22 493

原创 Spring Boot + Docker:实现可挂载可热更新的 config.json

摘要: 本文解决前端读取config.json时Docker挂载覆盖无效的问题。由于Spring Boot不会自动替换jar内的静态资源,挂载的文件仅优先级更高但不会覆盖。解决方案: 后端Controller优先读取外部挂载文件/app/config/config.json 不存在时fallback到jar内classpath:/static/config.json 设置Cache-Control: no-store避免缓存 配置Docker时指定静态资源路径 效果: 支持热更新、多路径访问,修改后无需重启

2026-01-29 16:58:17 492

原创 深入理解 Docker 挂载中的 :ro —— 为什么要用只读挂载?

Docker挂载中的:ro作用解析 在Docker中,:ro表示只读挂载,即容器只能读取宿主机的文件/目录,无法修改或写入。默认不加后缀时为读写模式(:rw)。 核心优势 安全性:防止容器意外修改关键文件(如配置、证书) 稳定性:避免程序错误或攻击导致宿主机数据损坏 控制性:适合静态资源、配置文件等无需写入的场景 使用场景对比 只读(:ro):配置文件、静态网站、密钥 读写(:rw):日志目录、开发环境代码同步 通过docker inspect可验证挂载模式,Compose文件支持简写:ro或长语法read

2026-01-29 16:44:57 895

原创 Spring Cloud OpenFeign:从 fallback 到 fallbackFactory 的最佳实践与差异解析

摘要:在微服务架构中,Spring Cloud OpenFeign的fallback和fallbackFactory是处理服务调用失败的关键机制。fallback提供基础降级能力但无法获取异常信息,而fallbackFactory能捕获具体异常,支持差异化降级策略,更适合生产环境。本文对比了两者差异,指出fallbackFactory在异常处理、日志记录和排障方面的优势,建议生产级微服务优先采用fallbackFactory,以实现更精细的容错控制和系统稳定性。(149字)

2026-01-29 09:47:06 1032

原创 ConcurrentHashMap 内幕:CAS 与 synchronized 的完美配合

摘要: ConcurrentHashMap通过混合并发策略实现高性能线程安全: CAS无锁机制处理空桶插入等简单操作,避免锁开销 synchronized局部锁保护非空桶的链表/红黑树结构修改,仅锁定单个桶 采用volatile读实现完全无锁的查询操作 通过分段锁策略(桶级锁)实现高并发,性能远超Hashtable的全局锁 在保证线程安全的同时,兼顾了读写性能与扩容效率 设计核心思想:针对不同场景灵活选用CAS(快速单点更新)与synchronized(复杂结构保护),实现安全性与性能的最佳平衡。

2026-01-28 13:50:18 1339

原创 Spring 策略模式中的落地实践(含 Map/List 自动注入)

摘要:企业级系统中常遇到"根据不同类型执行不同逻辑"的需求,如支付方式、审批流程等。传统if/else写法导致代码臃肿难维护,而策略模式结合Spring的List/Map自动注入机制能完美解决这一问题。通过定义策略接口和多个实现类,Spring自动收集所有策略并注入Map,使用时直接按类型获取对应策略执行。这种方案具有零侵入扩展、自动聚合策略、符合开闭原则等优势,能实现高度灵活的插件化架构,是企业处理多类型策略场景的首选方案。

2026-01-28 11:49:33 1276

原创 线程池的优雅关闭:shutdown() 与 shutdownNow() 方法详解

本文探讨了Java线程池的优雅关闭方法,对比了shutdown()和shutdownNow()的使用场景和执行机制。shutdown()会等待已提交任务完成,适合需要保证任务完整执行的场景;而shutdownNow()会立即中断任务并清空队列,适用于紧急终止场景。通过代码示例展示了两种方法的行为差异,并解析了shutdown()的内部执行流程,包括状态转换和空闲线程中断等关键步骤。合理选择关闭方式对资源释放和任务完整性至关重要。

2026-01-28 11:42:14 696

原创 Jenkins 配置 GitLab 认证并实现自动化部署

本文详细介绍了Jenkins与GitLab集成的配置方法,主要包括:1)在GitLab生成API Token;2)在Jenkins中添加GitLab凭证;3)配置Jenkins与GitLab的全局连接;4)在Jenkins任务中设置GitLab源码管理;5)通过Publish Over SSH插件实现构建后自动部署JAR包到远程服务器。文章提供了完整的配置流程和关键步骤截图,帮助实现CI/CD自动化部署。

2026-01-27 09:14:28 1230

原创 Docker 部署 Milvus 并连接现有 MinIO 对象存储

摘要:本文介绍如何通过Docker Compose部署开源向量数据库Milvus,并集成现有MinIO对象存储服务。主要内容包括:1)准备Docker和MinIO环境;2)下载Milvus standalone版Docker Compose文件;3)修改配置指向现有MinIO服务;4)启动容器并验证服务状态。部署完成后,Milvus将使用指定MinIO存储向量数据,提供19530(gRPC)和9091(Web UI)两个服务端口。该方案适用于需要快速搭建AI/搜索场景向量检索服务的场景。

2026-01-27 09:09:52 346

原创 Java + FFmpeg 实现视频分片合并(生成 list.txt 自动合并)

本文介绍了使用Java调用FFmpeg合并多个视频分片的方法。通过FFmpeg的concat demuxer机制,可以无损合并编码格式一致的视频片段。实现步骤包括:生成合并列表文件list.txt(每行格式为file 'path/to/video.mp4'),然后调用FFmpeg命令进行合并。文章提供了完整的Java代码示例,详细说明了列表文件生成和FFmpeg调用的关键点,并指出该方法适用于编码一致的MP4分片按序拼接场景,强调分片参数必须一致才能确保合并成功。

2026-01-26 16:05:20 852

原创 Spring Boot 自动装配全解析:原理、规范与改造实践

Spring Boot自动装配机制通过@AutoConfiguration注解和条件装配,实现了模块化配置的自动加载。其核心原理是启动时读取AutoConfiguration.imports文件加载配置类,配合@ConditionalOnProperty实现功能开关控制,使用@ConditionalOnMissingBean允许用户覆盖默认实现。典型应用场景包括:将重复配置标准化(如安全模块),通过配置文件动态启用/禁用功能,实现"一次编写,多处复用"的效果。该机制显著提升了代码复用性和

2026-01-26 14:43:32 601

原创 掌握 SQL 窗口函数:分组、排名与最新记录获取的最佳实践

窗口函数是SQL中处理分组计算但保留明细数据的强大工具。它通过OVER子句实现分组(PARTITION BY)和排序(ORDER BY),与GROUP BY不同,不会合并行。主要包含四类函数:排名类(ROW_NUMBER/RANK/DENSE_RANK)用于TopN查询;聚合类(COUNT/SUM等)可保留明细统计;偏移类(LAG/LEAD)用于前后记录对比;首尾值函数获取组内极值。相比GROUP BY只能获取聚合值,窗口函数能同时获取明细和分组计算结果,是处理"每组最新记录"等需求的理

2026-01-26 10:36:34 960

原创 深入理解 ZLMediaKit HTTP Hook 机制

摘要: ZLMediaKit的WebHook机制是一种事件驱动的实时通知系统,通过HTTP POST JSON推送关键业务事件(如推流/播放/状态变更等)。开发者可监听特定事件(如on_publish鉴权、on_stream_none_reader无人流关闭)并返回响应以控制ZLMediaKit行为。核心优势包括实时性、自定义业务处理(鉴权、统计、资源管理)与事件驱动架构。需注意快速响应鉴权事件、严格遵循返回结构,并异步处理非敏感事件。典型应用场景涵盖流媒体鉴权、自动拉流、节点监控及录制文件处理等,显著提升

2026-01-26 09:28:44 1137

原创 WebRTC / HLS / HTTP-FLV 的本质区别与选型指南

直播协议选型指南:WebRTC、HLS、HTTP-FLV对比 直播系统选型核心取决于延迟需求和稳定性要求: WebRTC(0.2-1s延迟):适合无人机、实时监控等超低延迟场景,但实现复杂、成本高 HLS(5-15s延迟):最稳定通用,适合课程、活动直播,兼容性最佳且成本低 HTTP-FLV(1-3s延迟):内网大屏等中低延迟场景的性价比选择 建议: 实时同步场景选WebRTC 公网直播首选HLS 内网低延迟用HTTP-FLV 实际部署常采用多协议输出方案,通过ZLMediaKit等服务器实现协议转换。

2026-01-25 15:31:54 1116

原创 Spring Boot 事件机制详解:原理 + Demo

Spring事件机制提供了一种解耦业务逻辑的有效方式,通过发布-订阅模型实现核心业务与后续操作的分离。当用户注册等核心业务完成后,只需发布事件,由独立的监听器处理邮件发送、日志记录等后续操作,避免形成"上帝方法"。该机制通过定义事件类、发布事件和实现监听器三个核心步骤实现,具有扩展性强、符合单一职责原则等优点。支持@EventListener简化代码和@Async异步处理等进阶用法,适用于用户注册、状态变更等场景,但不适合需要同步返回结果的强一致性事务。Spring事件机制本质上是轻量级

2026-01-25 10:51:49 923 1

原创 AtomicInteger vs LongAdder:深入理解高并发计数器的演进

摘要: 在高并发系统中,AtomicInteger和LongAdder虽然都是原子计数器,但性能差异显著。AtomicInteger通过单变量CAS实现,低并发下性能优秀,但高并发时因竞争激烈导致性能下降。LongAdder采用Striped64的分段累加机制,通过分散线程到不同Cell单元减少冲突,大幅提升高并发吞吐量。LongAdder适合写多读少的统计场景(如QPS、接口调用次数),但无法保证强一致性;AtomicInteger适用于需要精确值的场景(如订单号、库存扣减)。Striped64的核心优化

2026-01-24 14:30:50 1187

原创 基于 Flink + RabbitMQ + WebSocket + Leaflet 的「科目 + 视野订阅」实时轨迹推送方案(含数据结构)

实时轨迹系统优化方案 针对WebSocket广播模式导致的性能问题,提出基于订阅模型的优化方案。系统通过前端主动上报关注科目和地图视野范围(viewport),后端仅推送符合条件的轨迹数据。核心实现包括: 状态型订阅协议:前端定期发送包含科目和viewport的JSON消息 精准过滤机制:后端对每个MQ消息进行双重判断(科目匹配+轨迹点视野交集) Leaflet集成:利用地图库原生方法获取当前可视范围 该方案有效解决了广播模式下的乘法效应问题,显著降低系统负载和前端处理压力。

2026-01-24 14:10:39 1024

原创 【Flink 轨迹实战】看懂距离、速度过滤代码:为什么要用 Haversine?抖动点和异常点怎么判断?

本文介绍了轨迹数据处理中的关键过滤方法,主要包括:1)通过Haversine公式计算两点间距离;2)基于时间差计算移动速度;3)设置最小移动距离阈值过滤GPS抖动点;4)设置最大速度阈值过滤异常点。文章详细解析了时间差计算、球面距离算法、抖动点识别和异常速度判断的实现逻辑,并提供了典型场景的速度阈值建议。这些过滤方法能有效消除GPS漂移和设备异常导致的轨迹失真,确保数据符合物理常识,为下游分析提供可靠基础。核心思想是通过时空约束条件验证定位数据的合理性。

2026-01-24 14:02:57 813

原创 Flink Watermark 卡住的真正原因:keyBy 根本不是“时间分区”

Flink事件时间开发中常遇到窗口不触发的问题,核心在于混淆了两种分区:Source物理分区(subtask)和keyBy逻辑分区(key)。Watermark仅与Source物理分区相关,每个subtask维护独立的时间线,而key仅影响数据路由和状态隔离。当某个key停止发送数据时: 若该key所在subtask仍有其他活跃key,watermark仍会推进; 若整个subtask无数据,watermark会被卡住(可通过withIdleness解决)。正确理解"subtask是最小时间推进单

2026-01-24 10:37:05 745

原创 MySQL InnoDB 锁机制深度解析:行锁、表锁、间隙锁、临键锁(Next-Key Lock)

本文系统讲解MySQL(InnoDB)中的四种常见锁机制:表锁、行锁、间隙锁和临键锁。表锁粒度最粗,会锁定整张表;行锁通过索引精确锁定单条记录,并发性能最佳;间隙锁锁定记录间的空隙防止幻读;临键锁结合记录锁和间隙锁,是RR隔离级别的默认策略。文章分析了每种锁的特点、适用场景和潜在风险,特别指出索引失效、范围查询加锁等常见性能陷阱,并给出避免锁冲突的实用建议,如使用精确条件、添加合适索引、采用Redis处理热点数据等。理解这些锁机制对优化数据库并发性能和避免死锁至关重要。

2026-01-23 11:20:04 836

原创 深入理解 MySQL 四种事务隔离级别及其适用场景

隔离级别脏读不可重复读幻读是否影响查询性能✔✔✔否⭐⭐⭐⭐⭐✖✔✔否⭐⭐⭐⭐REPEATABLE READ(默认)✖✖✖(MySQL 实现)必要时⭐⭐⭐✖✖✖✔(读写都锁)⭐⚠️ 在 MySQL InnoDB 中,RR 已经通过 MVCC + Next-Key Lock 解决幻读。读未提交:最快,但最危险(不用)读已提交:高并发,Oracle 默认可重复读:MySQL 默认,最常用串行化:最安全,但最慢。

2026-01-23 10:56:50 925

原创 Spring Boot 多模块项目中优雅实现自动配置(基于 AutoConfiguration.imports)

本文介绍了在Spring Boot多模块项目中实现自动配置的方法。通过RabbitService示例,讲解了如何利用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件注册自动配置类,使业务模块只需引入依赖即可使用公共功能。文章重点说明了自动配置的核心机制,包括配置类编写、条件注解使用,以及如何通过AutoConfiguration.imports文件而非@AutoConfiguration注解来

2026-01-23 10:48:13 1113

原创 Flink 状态管理详细总结:State 分类、Keyed State 实战、Operator State、TTL、状态后端选型

Flink状态管理是实时计算的核心能力,本文系统梳理了Flink状态机制。主要内容包括:状态的概念与必要性(如UV统计需记录用户访问记录);托管状态与原始状态的区别(推荐使用Flink托管的Managed State);Keyed State的五大类型(Value/List/Map/Reducing/Aggregating)及其典型应用场景(如水位差值告警使用ValueState);状态TTL配置方法;Operator State的三种类型及应用(如Kafka connector保存offset);状态后端

2026-01-23 10:34:07 1063

原创 Flink 中 MapFunction、RichMapFunction、ProcessFunction、KeyedProcessFunction 的区别

本文对比了Apache Flink中四种常用Function的特点和适用场景。MapFunction是最简单的逐条映射;RichMapFunction增加了生命周期管理;ProcessFunction提供底层流控制能力;KeyedProcessFunction则支持状态管理和定时器,是处理复杂业务的核心。文章通过表格对比了四种Function的能力差异,并给出了示例代码和使用场景建议。最后总结出从Map到KeyedProcess是一个能力逐级增强的过程,建议根据业务复杂度选择合适的Function类型。

2026-01-22 11:29:20 973

原创 一文讲透 Java 中transient的用处(结合 Flink 理解)

本文深入解析了Java中transient关键字的作用及其在Flink开发中的关键应用。transient用于标记不参与Java默认序列化的字段,这在Flink状态管理中尤为重要。文章指出,Flink中的State(如ValueState)实际上是运行时句柄而非业务数据,必须标记为transient以避免序列化问题。同时强调State应在open()方法中初始化,而非构造函数。文中还区分了需要和不需要加transient的字段类型,并提供了标准写法模板。最终指出transient的本质是让运行时资源由Fli

2026-01-22 11:28:19 1107

原创 为什么企业级项目一定要用 PostGIS?和普通存经纬度到底有什么区别?

PostGIS作为PostgreSQL的空间扩展,远非仅存储经纬度,而是提供了完整的空间计算能力。相比普通数据库将经纬度作为普通字段存储,PostGIS具备三大核心优势:1)真正的空间数据类型,能理解点线面等地理对象;2)高效的空间索引,支持千万级数据的快速查询;3)数百个成熟的空间函数,解决距离计算、区域判断等复杂需求。在企业级应用中,PostGIS能确保空间计算的准确性、高性能和可扩展性,避免普通方案在业务演进时面临的性能瓶颈和重构风险。对于涉及地理位置、区域判断等空间关系的系统,PostGIS已成为不

2026-01-21 09:35:12 970

原创 RabbitMQ + Flink 为什么必然会重复?以及如何用 seq 做稳定去重

摘要: Flink使用RabbitMQ作为Source时,由于at-least-once语义和Checkpoint恢复机制,数据重复不可避免。本文提出基于严格递增序列号(seq)的幂等去重方案:采集侧为每个实体(如设备ID)生成唯一seq,Flink通过维护last_seq状态,丢弃seq <= last_seq的重复数据。该方案不依赖MQ或Checkpoint的精确性,支持乱序、重启和重放,适用于轨迹、IoT等场景,逻辑简单且性能高效。核心思想是"上游保证唯一性,下游实现幂等",

2026-01-21 09:31:44 1199

原创 RabbitMQ 中 Ready 和 Unacked 到底是什么意思?如何用它们判断系统是否健康

摘要:RabbitMQ中的Ready和Unacked指标是判断系统健康的关键指标。Ready表示队列中待消费的消息数量,其持续增长反映消费能力不足;Unacked表示已投递但未确认的消息数量,高值可能因消费者处理慢或prefetch设置过大。两者结合可判断系统状态:Ready增长+Unacked小说明消费者不足,Ready小+Unacked高反映消费慢或配置问题,两者同时增长表明系统超载。建议根据消费线程数合理设置prefetch值(约为线程数的2-5倍)。监控这两个指标能有效识别性能瓶颈,避免消息积压问题

2026-01-21 09:29:57 1097

原创 Apache Flink 窗口处理函数全解析(增量 + 全量 + 混合)

Flink窗口处理函数是处理无界流数据的核心机制,主要分为增量处理和全量处理两种方式。增量处理(如reduce和aggregate函数)能实时更新结果,具有低延迟和节省空间的优点;全量处理(如apply和process函数)则在窗口结束时一次性计算,可访问完整窗口数据。文章通过传感器温度统计的案例,展示了如何结合这两种处理方式,在实时性和准确性之间取得平衡。关键点包括窗口划分、Watermark处理以及不同类型处理函数的选择与实现,为流处理场景提供了实用的解决方案。

2026-01-20 09:57:10 447 1

原创 深入理解 Apache Flink 的时间语义、Watermark 与窗口触发机制

摘要:本文深入解析Apache Flink实时流计算中的三个核心概念:时间语义、Watermark和窗口机制。重点阐述事件时间(Event Time)的业务价值,以及Watermark如何解决乱序事件问题(通过maxEventTime-allowedLateness推进逻辑时间)。详细说明窗口触发条件(Watermark≥窗口结束时间),并通过真实案例演示Watermark不触发窗口的原因。最后给出完整代码示例,展示如何配置事件时间提取、乱序容忍和迟到数据处理。全文揭示了Flink基于事件时间进行正确统计的

2026-01-20 09:26:12 713

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除