自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ClickHouse系列(十):生产架构与最佳实践总结

本文作为ClickHouse系列总结篇,从生产环境角度系统梳理了架构选型和运维要点。首先分析了分片/副本架构的代价,包括查询复杂度、数据倾斜等问题,建议优先使用ClickHouse Keeper替代ZooKeeper。其次介绍了Kubernetes环境中ClickHouse Operator的核心设计,包括节点扩缩容、配置变更等自动化方案。然后深入探讨了TTL机制、磁盘膨胀原因及空间回收操作,提供了实用SQL命令。最后提出了一套可观测性数据的统一建模方案,涵盖日志、指标和追踪数据的表结构设计。全文提供可直接

2026-04-10 09:33:38 601

原创 ClickHouse系列(九):慢查询、内存 OOM 与稳定性治理

文章摘要 本文系统解析了ClickHouse在生产环境中面临的慢查询和内存溢出两大核心痛点。首先介绍了通过system.query_log系统表诊断慢查询的方法,包括Top慢查询定位、查询模式聚合分析和异常捕获。其次深入分析了Merge和Aggregation操作的内存模型,提出内存消耗估算公式。最后针对内存溢出问题,给出典型场景分类和多层次治理策略,包括设置内存防线、优化GROUP BY基数等实用方案。全文提供大量SQL示例和配置参数,为ClickHouse性能调优和稳定性保障提供了系统化指导。

2026-04-10 09:30:51 446

原创 ClickHouse系列(八):ClickHouse 的 UPDATE / DELETE 正确姿势

ClickHouse的UPDATE/DELETE操作(Mutation)性能较差,主要由于列式存储架构导致需要重写整个数据块而非单行修改。本文解析了Mutation机制及优化方案:1)Lightweight Update适用于少量修改但存在诸多限制;2)推荐使用ReplacingMergeTree+版本号的覆盖写入模式;3)提出追加写入设计思想,包括事件溯源、快照增量等模式;4)对于必须重写的场景(如修改排序键),给出了标准流程。最佳实践是将数据变更转化为追加写入,避免直接UPDATE。针对不同场景提供了决

2026-04-09 09:26:06 506

原创 ClickHouse系列(七):Materialized View 与多分辨率 Rollup 设计

本文探讨了如何利用ClickHouse的Materialized View和AggregatingMergeTree实现高效的多级时序数据聚合查询。通过构建Raw/10min/1h/1d多分辨率聚合链路,以写入时的计算成本换取查询性能的大幅提升。文章详细解析了MV同步计算机制、性能代价、表结构设计、聚合函数配对使用等关键技术点,并对比了不同查询场景下的性能差异。实践表明,这种用空间换时间的多级Rollup方案,能有效解决时序数据查询中的性能瓶颈问题,是监控、日志分析等场景的标准做法。

2026-04-09 09:24:46 615

原创 ClickHouse系列(五):ClickHouse 写入链路全解析(Insert 到 Merge)

摘要: ClickHouse的写入机制中,每次INSERT都会生成至少一个Part(数据目录),高频小批量写入或跨分区数据插入会产生大量小Part,导致系统性能下降。小Part会引发文件描述符暴增、稀疏索引膨胀和后台Merge压力剧增,最终触发parts_to_throw_insert保护机制。优化方案包括批量写入(每批10万行以上)、调整min_insert_block_size参数,以及避免跨分区高频插入。通过监控system.parts和system.merges表可及时发现Part数量异常,紧急情况

2026-04-08 09:18:17 637

原创 ClickHouse系列(六):Kafka 到 ClickHouse 的生产级写入架构

本文介绍了ClickHouse Kafka引擎在实时写入链路中的定位和优化方法。Kafka引擎本质是消费管道而非存储表,需配合物化视图和MergeTree表实现三层架构。重点分析了消费模型的关键参数,如kafka_max_block_size、kafka_flush_interval_ms等,并指出常见误区:消费并行度受限于Kafka分区数,需设置kafka_thread_per_consumer=1才能实现真正并行。针对消费倾斜问题,提出需检查生产者分区策略并确保消费者数与分区数匹配。最后给出了10万+/

2026-04-08 09:16:50 972

原创 ClickHouse系列(四):压缩不是为了省磁盘,而是为了更快的查询

摘要:ClickHouse通过压缩显著提升查询性能,核心原理是减少磁盘IO时间。LZ4适合热数据,解压速度快;ZSTD适合冷数据,压缩率高。针对不同字段类型,推荐组合使用预处理编码(如DoubleDelta、T64)与压缩算法,时间戳可达90倍压缩,低基数字符串可达300倍。生产环境中,应根据数据类型选择最优Codec组合,平衡压缩率、CPU开销和IO性能。

2026-04-08 09:12:35 516

原创 ClickHouse系列 (一):为什么 ClickHouse 具备高性能分析能力

ClickHouse 极速查询的奥秘:列式存储与向量化执行 摘要:ClickHouse 凭借其卓越的OLAP性能,通过列式存储和向量化执行实现数量级的速度提升。与传统行式数据库不同,ClickHouse采用列式布局,只需读取查询涉及的列,配合高效压缩使I/O量锐减至1.5%。其向量化引擎批量处理8192行数据,充分利用CPU流水线和SIMD指令。通过稀疏索引和分区裁剪,即使全表扫描也能高效定位数据。独特的物理存储结构保证多列数据对齐,实现快速聚合查询。这些设计使ClickHouse在分析场景下展现出碾压级优

2026-04-07 09:36:59 603

原创 ClickHouse系列(三): 表结构设计的核心原则

ClickHouse Schema设计核心原则:ORDER BY是性能关键,应优先选择低基数列作为前缀,使稀疏索引能跳过更多数据块。主键不保证唯一性,而是用于查询加速。分区应按时间合理划分(推荐100万-1亿行/分区),避免过细导致性能下降。高基数字段应放ORDER BY末尾或使用跳数索引优化。LowCardinality类型适合基数<1万的列,可显著提升压缩率和查询速度。生产级设计需综合这些原则,如示例Trace表将service_name等低基数列前置,timestamp居中,trace_id末尾

2026-04-07 09:30:39 367

原创 ClickHouse系列(二):MergeTree 家族详解

本文详细介绍了ClickHouse的MergeTree表引擎家族。MergeTree采用LSM-Tree架构,通过Part物理分片组织数据,每个INSERT操作都会生成新Part,实现高效写入。数据按Granule逻辑单元划分,利用稀疏索引加速查询。

2026-04-07 09:28:44 451

原创 Resilience4j 入门

Resilience4j是一款轻量级Java容错库,提供熔断、重试、限流等机制,适用于微服务架构。其核心模块包括断路器(状态管理)、重试(自动恢复)、限流器(请求控制)、隔离器(资源保护)等,支持编程式、SpringBoot配置和注解三种使用方式。与Hystrix相比更轻量,与Sentinel相比更易集成。实际应用中需结合业务调优参数,并配合监控系统确保可靠性。该库特别适合处理网络抖动、服务故障等分布式系统常见问题,能有效提升系统弹性。

2025-12-11 15:40:23 989

原创 Reactor Context 详解

Project Reactor 的 Context 机制是响应式编程中替代 ThreadLocal 的线程无关上下文解决方案。它通过可附加在流链上的不可变键值存储传递业务无关信息,克服了线程切换导致的数据丢失问题。Context 提供读写 API 和传播规则:订阅时绑定并向上游传播,最近写入优先,内层序列写入不影响外层。从 Reactor 3.5.0 开始,通过与 Micrometer 集成支持 Context 与 ThreadLocal 互通,实现了日志追踪 ID 等上下文信息的无缝传递。该机制避免了在方

2025-12-04 10:12:00 1092

原创 Reactor Hooks 详解

Hooks 是全局且强大的扩展点,提供 operator 拦截、错误/丢弃策略、上下文传播控制等能力。使用时务必注意:hook 内不可随意调用 Flux/Mono,组装栈影响性能,生产使用需谨慎,并用 key 管理子钩子以避免冲突。与相关技术对比(简要)Spring AOP:AOP 作用于方法级;Hooks 作用于 Reactor operator 层,粒度更细且与流的组装有关Netty/Servlet 过滤器:更偏向请求链;Hooks 用于流内部构造与信号处理。

2025-11-27 08:01:02 541

原创 系统性能瓶颈分析三定律

分布式系统性能优化不应简单依赖资源扩容。三大定律揭示了性能瓶颈的结构性本质:利特尔定律指出延迟微小增加会引发排队剧增;阿姆达尔定律表明串行处理环节构成性能天花板;通用可扩展性定律说明高并发下资源竞争和一致性开销会导致扩容效果递减甚至负增长。有效解决方案应从重构系统结构入手:减少串行点、降低延迟、优化竞争策略、采用最终一致性等。理解这些底层规律,才能在高并发场景下实现真正的弹性扩展。

2025-11-19 12:02:49 594

原创 Server-Sent Events 详解

SSE 是最轻量的实时推送基于 HTTP 长连接,无需升级协议浏览器自动重连,不用写复杂 JSWebFlux 返回 Flux 就能天然变成 SSE实际应用要注意心跳、速率控制、多客户端广播分布式环境要处理负载均衡和事件一致性状态流(AI token、日志、构建进度)非常适合 SSE。

2025-11-17 19:00:00 1167

原创 设计模式之观察者模式

观察者模式是一种行为型设计模式,用于建立对象间一对多的依赖关系,当被观察者状态变化时自动通知所有观察者。其核心思想是解耦数据变化与响应行为,通过注册机制实现动态绑定。Spring框架中的事件机制是对观察者模式的典型实现,包含事件发布、监听和广播三个核心组件,支持同步/异步处理。该模式适用于用户注册、订单支付等需要业务解耦的场景,常与工厂模式、策略模式等配合使用,是事件驱动架构的基础。相比责任链、中介者等模式,观察者模式更侧重广播通知的特性。

2025-11-12 09:14:07 1207

原创 Colima 入门

摘要:Colima是一款轻量开源的容器工具,专为macOS设计,替代资源占用高的Docker Desktop。它基于Lima虚拟机运行Linux容器,支持Docker CLI和containerd,性能优于传统方案。通过VirtioFS实现高效文件共享,支持私有仓库证书配置、Kubernetes集成(k3s)和灵活的资源分配。核心优势包括:自由开源、低资源消耗、CLI优先设计,适合开发者构建本地测试环境。

2025-10-23 11:23:06 1122

原创 maven-jlink-plugin入门

JDK9模块化系统(JPMS)将JDK拆分为模块,支持定制化JRE。maven-jlink-plugin作为Maven对jlink的封装,自动化完成模块依赖分析、镜像生成和依赖管理。它能生成精简的独立运行时镜像(可小至30MB),支持与jpackage集成打包为安装包或Docker镜像。该插件需基于模块化项目(需module-info.java),通过配置可优化镜像体积,适合云原生场景。

2025-10-09 16:44:52 641

原创 模块化模式

模块化设计通过划分高内聚、低耦合的单元来管理复杂系统,核心价值在于控制复杂度、支持并行开发和提升复用性。设计遵循单一职责、显式依赖等原则,合理划分边界。实现时可选择模块化单体或微服务,需注意接口契约、依赖管理和可观测性。从单体迁移需渐进式推进,避免常见反模式。模块化虽增加短期成本,但能显著提升系统的长期可维护性和演化能力,是应对软件复杂性的有效策略。

2025-10-09 10:17:53 1038

原创 docker 跨架构兼容

探讨了Docker跨架构兼容性问题及解决方案。在ARM架构设备上构建的容器无法直接在x86架构Linux运行,可通过两种方式解决:1)使用docker buildx构建多架构镜像(支持amd64/arm64),需推送到远程仓库;2)指定平台构建单架构镜像(如amd64)。文中详细介绍了构建命令、注意事项(基础镜像选择、本地测试、缓存处理等)及不同方案的优缺点。多架构镜像是官方推荐方案但构建复杂,单架构方案简单直接但功能有限。开发者可根据实际需求选择合适方法实现跨平台部署。

2025-09-29 09:21:14 1189

原创 JAVA 25新功能介绍

Java 25是2025年9月发布的LTS版本,相比Java 21在多方面进行了优化升级。主要改进包括:语言层面新增原始类型模式匹配、灵活构造函数体等语法特性;性能方面引入AOT方法剖析和对象头压缩优化,提升启动速度和内存效率;可观察性增强JFR的CPU时间剖析能力;新增ScopedValues替代ThreadLocal,更适合虚拟线程场景;安全方面标准化了KDF API和PEM编码支持。但这些优化中部分特性仍处于预览或实验阶段,升级需谨慎评估兼容性和性能影响。建议生产环境先仅启用稳定特性,并做好全面测试验

2025-09-28 09:55:48 1590

原创 java 轻量级对象审计工具-JaVers

Javers是一个Java对象审计和差异比较框架,能高效比较对象状态变化并生成变更记录。它支持递归比较对象图、集合差异分析,提供快照存储和审计历史查询功能。通过Maven引入依赖后,可快速实现对象比对(如javers.compare())和变更记录(如diff.prettyPrint())。高级特性包括字段忽略、自定义比较器和SpringBoot集成,适用于配置比对、审计日志等场景。相比同类工具,Javers更专注于对象关系与审计能力,适合需要版本管理和变更追踪的系统。

2025-09-15 11:50:40 1458

原创 响应式客户端 WebClient详解

摘要: WebClient是Spring5提供的非阻塞响应式HTTP客户端,基于Reactor实现异步I/O,支持Mono/Flux响应流,适用于微服务、API网关等高并发场景。相比RestTemplate,它具有非阻塞、自动编解码、背压机制等优势。文章详解了WebClient的创建、请求构建(GET/POST/文件上传)、响应处理(Mono/Flux转换)、错误处理机制,以及连接池配置、拦截器、SSE流式处理等高级功能。最佳实践包括单例复用、资源

2025-09-10 14:44:22 1559

原创 Reactor 入门及实践

Reactor是一个完全非阻塞的JVM响应式编程基础,有着高效的需求管理(背压的形式)。它直接整合Java8的函数式API,尤其是Stream,还有Duration。提供了可组合的异步化序列API —Flux(对于 0...N个元素) andMono(对于 0或1元素) — 并广泛实现响应式Stream规范。非阻塞:不用线程等待 I/O,提升资源利用率。声明式:数据流和操作通过链式调用拼装。背压:下游可以控制上游生产速率,避免“洪水”。等就是基于 Reactor 的。

2025-09-01 17:45:52 1062

原创 Java响应式编程

本文介绍了Java响应式编程的核心概念与实现。响应式编程采用函数式+事件驱动机制,通过Publisher/Subscriber模型实现非阻塞数据流处理,核心特性包括背压机制、丰富操作符和异步调度。主流实现有Reactor、RxJava等,其中Reactor的Mono/Flux成为Spring生态标准。相比传统命令式编程,响应式在IO密集型场景下能用更少线程支撑更高并发,但存在学习曲线陡峭、调试困难等问题。

2025-08-27 11:40:04 1192

原创 springboot源码解析之配置管理

SpringBoot配置管理体系解析:通过Environment聚合多种配置源(命令行、环境变量、配置文件等),由ConfigFileApplicationListener加载application.yml/properties并按优先级排序存储。关键注解处理包括:@Configuration由ConfigurationClassPostProcessor解析,@Value通过AutowiredAnnotationBeanPostProcessor注入,@ConfigurationProperties利用B

2025-08-25 19:28:11 738

原创 spring async 入门到精通

本文介绍了Java中异步线程池的应用及Spring框架下的实现方式。异步线程池适用于IO请求、消息消费等场景,能减少主线程阻塞、提升吞吐量。Spring通过@EnableAsync开启异步支持,推荐使用ThreadPoolTaskExecutor配置线程池,并支持CompletableFuture等返回值类型。文章分析了Spring异步处理的源码实现,包括代理生成和任务拦截机制,并提供了最佳实践建议:合理配置线程池参数、使用CompletableFuture、处理异常和上下文传递、实现优雅停机和线程池隔离等

2025-08-22 17:09:38 772

原创 设计模式之装饰模式

摘要:装饰模式是一种结构型设计模式,通过动态包装对象来扩展功能,避免类爆炸问题。Java I/O库中的BufferedInputStream和DataInputStream就是典型应用,通过组合方式增强原始流功能。该模式遵循开闭原则,但多层装饰可能影响性能。与代理模式的区别在于:装饰模式侧重功能增强,代理模式侧重访问控制。

2025-08-22 11:35:25 1062

原创 Spring Cloud LoadBalancer 最佳实践

摘要: Spring Cloud LoadBalancer(SCLB)是Spring官方推出的新一代客户端负载均衡器,用于替代Netflix Ribbon。相较于Ribbon,SCLB采用轻量化、响应式设计,深度集成Spring生态(如WebClient、Reactor),支持非阻塞调用和灵活的策略扩展。核心差异包括:SCLB基于函数式编程(如ServiceInstanceListSupplier和ReactorServiceInstanceLoadBalancer),与Feign、DiscoveryCli

2025-08-18 17:16:14 1402

原创 ThreadPoolExecutor 最佳实践

高 3 位表示线程池状态(RUNNING/SHUTDOWN/STOP/TIDYING/TERMINATED)(LinkedBlockingQueue 默认无界 → maximumPoolSize 失效)线程池被 Spring 代理关闭 → 任务丢失(需显式。(不同任务用不同线程池,避免互相阻塞)任务执行时间过长 → 队列堆积,延迟高。(控制并发度、任务队列、拒绝策略)核心业务与非核心业务用不同线程池。→ 直接创建新线程执行任务(→ 尝试创建非核心线程(,封装了线程对象和首个任务。

2025-08-14 14:51:09 746

原创 JDK 9~17 新特性及升级建议

Java模块化演进与性能优化 摘要:JDK9引入的模块化系统(JPMS)彻底改变了Java的依赖管理方式,通过module-info.java声明模块依赖和导出,实现更好的封装性和隔离性。JDK10-17持续优化性能特性,如AppCDS通过类元数据共享显著提升启动速度,支持动态归档生成。新一代GC(ZGC/Shenandoah)提供低延迟选择,而Records、文本块等新语法简化开发。迁移时需注意内部API封装加强带来的兼容性问题,建议新项目直接采用模块化架构,旧项目可逐步迁移。

2025-08-12 16:39:40 1036

原创 PreparedStatement vs Statement 深度对比 (postgresql)

JDBC接口中Statement与PreparedStatement在PostgreSQL实现中存在显著差异:Statement每次执行需拼接完整SQL字符串,导致重复解析开销且存在SQL注入风险;PreparedStatement通过参数绑定提高安全性,并利用缓存机制优化性能。PostgreSQL JDBC驱动通过prepareThreshold参数控制服务端预编译时机,当执行次数达到阈值后切换为ExtendedQueryProtocol,复用执行计划提升效率。

2025-08-10 12:05:42 1088

原创 多JDK版本管理方案-SDKMAN

SDKMAN! 是一款用于管理多版本开发工具的命令行工具,支持Java、Groovy、Maven等开发环境。它提供便捷的版本切换功能,能快速安装/卸载指定版本,设置默认或临时使用版本。通过软链接方式管理各工具版本,支持自定义添加本地JDK。适用于CI/CD环境统一、多项目并行开发和版本兼容性测试等场景。相比jEnv、asdf等工具,SDKMAN! 专注于Java生态,提供一站式的版本管理方案。

2025-07-29 16:44:33 1397

原创 云原生可观测-日志观测(Loki)最佳实践

本文介绍了云原生日志系统Loki的核心架构与最佳实践。Loki作为可观测性三大支柱之一,专注于低成本日志存储与查询,其优势在于类似Prometheus的标签模型和与Grafana的深度集成。文章详细解析了Loki的组件架构(包括Promtail、Loki、Grafana)、日志采集与标签管理策略、LogQL查询语法(基础查询、聚合分析、结构化日志解析)以及告警配置方法。同时提供了Grafana可视化联动、性能优化建议和典型场景查询示例,帮助构建完整的日志观测体系。

2025-07-25 09:25:07 1310

原创 如何避免redis分布式锁失效

摘要:分布式锁的核心目标是保证共享资源在任意时间只被一个客户端操作。Redis锁实现需关注TTL过期、内存淘汰、主从不一致等风险。系统性对策包括:1)租约续约机制(如Redisson WatchDog);2)锁key隔离存储;3)原子校验释放(Lua脚本);4)应对主从延迟(RedLock算法);5)补偿机制(幂等设计+状态持久化)。设计原则强调隔离性、可观测性和高可用,建议采用独立Redis DB、监控锁状态并确保业务完成前锁不释放。关键是在保证互斥的同时,通过架构设计预防锁失效导致的数据不一致问题。

2025-07-21 16:33:07 925

原创 HTTPie: 开发者友好的http客户端工具

摘要: HTTPie 是一个专为开发者设计的命令行 HTTP 客户端,相比 curl 更简洁优雅,适合调试和测试 RESTful API。核心特性包括自然语言语法、自动 JSON 处理、高亮输出、文件上传、会话管理和插件扩展。基本命令示例展示了 GET/POST 请求、添加 Header 和文件上传操作。与 curl/wget 对比,HTTPie 在 API 调试场景更友好,是开发者日常调试 API 的高效工具。

2025-07-18 18:39:55 1147

原创 Spring Boot 源码解析之 Logging

摘要:本文深入剖析了SpringBoot 2.x日志系统的核心设计与实现。系统采用LoggingSystem抽象层,支持Logback/Log4j2/JUL三种实现,通过硬编码Map+classpath探测机制自动选择。关键流程包括:LoggingApplicationListener在启动初期初始化日志系统;Log4J2LoggingSystem实现配置加载逻辑,支持多格式配置文件;提供Actuator端点实现动态日志级别调整。系统设计强调极早期可用性、自动探测和统一配置,通过log4j2-spring.

2025-07-16 17:39:31 1466

原创 Java 避免空指针的方法及Optional最佳实践

本文总结了避免空指针的通用方法和Optional的最佳实践。在空指针防范方面,建议从设计源头避免nullable属性,使用@Nonnull注解,运行时保护,以及NullObject模式。Java14+的增强NPE信息有助于调试。对于Optional的使用,推荐用于方法返回值表示可能缺失的情况,但不建议用于参数、类字段和集合包装。创建Optional时应区分of()和ofNullable(),消费值时优先使用orElse、orElseThrow等安全方法,避免直接get()。链式操作如map/flatMap/

2025-07-15 17:07:21 432

原创 springboot 单元测试

摘要:Spring Boot测试分为单元测试、切片测试、集成测试和端到端测试四个层级。其中单元测试是最基础且价值最大的测试方式,它完全隔离Spring环境,通过Mockito模拟外部依赖,仅测试Java业务逻辑,具有执行速度快、隔离性好等特点。推荐采用分层测试策略:80%逻辑使用纯单元测试,15%使用Spring切片测试,5%使用全局集成测试。单元测试应避免滥用@SpringBootTest,重点关注业务逻辑覆盖,适合在CI/CD流程中频繁运行。

2025-07-13 17:30:59 2320

原创 多模块项目的编译提效

摘要:优化Maven多模块构建的关键策略包括:1) 避免全量clean,利用增量编译;2) 使用mvnd守护进程减少JVM启动开销;3) 启用并行构建(-T参数);4) 精准编译(-pl -am参数);5) 利用构建缓存(Takari/Artifactory)。架构层面建议合理拆分模块,开发时可结合IDE增量编译。对于CI/CD,建议分阶段构建、启用并行和缓存。终极方案可考虑迁移到Gradle/Bazel等现代构建工具。这些方法组合使用可显著提升构建效率,在大型项目中效果尤为明显。

2025-07-13 10:32:49 817

空空如也

空空如也

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

TA关注的人

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