自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 @Transactional 失效的 7 种场景

Transactional 生效的前提:│├─ 1. 方法是 public ──→ 非 public 不代理│├─ 2. 通过代理对象调用 ──→ 自调用 / 手动 new 失效│├─ 3. 异常抛到代理层 ──→ catch 吞异常失效│├─ 4. 异常类型匹配 ──→ 受检异常默认不回滚(加 rollbackFor)│├─ 5. 传播行为正确 ──→ REQUIRES_NEW 会独立提交/回滚│├─ 6. 数据库支持事务 ──→ MyISAM 不支持│。

2026-06-29 11:28:22 215

原创 Shenandoah在容器环境的GC策略

背景我们的微服务部署在 K8s 集群上,每个 Pod 分配 4 核 8GB 内存,JVM 堆设为 6GB。容器环境下 GC 的行为和裸机有本质区别——CPU 资源受到 cgroup 限制,并发 GC 线程不能像裸机那样独占核心。在 JDK 21 环境下,我们对比了 G1、ZGC 和 Shenandoah 三款 GC 在容器中的表现,最终在部分对延迟敏感的服务上选择了 Shenandoah。这篇文章记录选型过程和调优细节。

2026-06-11 16:39:47 321

原创 SpringBoot 相关的 Skills 全景指南

一、Spring Boot 专用 Agent Skills以下 Skills 专为 Spring Boot 开发设计,直接提升 AI Agent 在 Spring Boot 项目中的编码质量。

2026-06-11 16:25:33 560

原创 GraalVM原生镜像启动速度与吞吐权衡

背景我们有一个内部运维工具服务,功能简单但启动后需要响应告警回调——冷启动延迟直接决定告警处理时效。这个服务用 Spring Boot 3.2 + JDK 21 编写,正常启动时间约 25 秒(Spring 上下文初始化 + Bean 加载 + 健康检查通过)。K8s HPA 在流量突增时需要拉起新 Pod,25 秒的启动时间意味着告警可能延迟处理。我们尝试用 GraalVM Native Image 把它编译成原生二进制,把启动时间压到亚秒级。

2026-06-11 16:24:58 239

原创 分布式一致性算法:Raft

另外,异步模式下,客户端在写入成功之后,立刻从系统读取数据,有可能读不到最新的数据,比如上图中,如果客户端写入s1之后立刻从s2 读取,读取的数据是过期数据。GFS系统中,Primary节点是由master(GFS中的元数据服务器)通过lease机制选择的,简单说来,GFS给某个节点颁发Lease,该节点就成为了Primary节点,Primary节点也可以在过期之前重新申请Lease,而且Lease的颁发、申请信息都是在chunkserver与master的心跳中,因此也不会带来过多额外的开销。

2026-06-06 09:13:14 370

原创 知识库(Elasticsearch,ES)检索

整体上,这个DSL的思路不是一上来就追求“最像”,而是先用多路召回把可能相关的标准诗句找出来,再通过后续相似度、ES分数和父文档回查进一步筛选,尽量避免真正正确的古诗文在第一阶段就被漏掉。但如果paragraph不止一句的话,句子间的召回结果可以互补,通常情况下,只要数据库有对应知识,很少会每一句都没有召回到对应知识。为了更好的检索出与输入切片相关的知识,也尽可能避免白话文召回不相关的知识,我们第一步需要使用。,来约束大模型的输出结构。但是,我们也提到了,输入的文档切片可能包含古诗文,也就是说输入的切片。

2026-06-05 16:04:46 227

原创 Redis和Redission实现延迟消息

可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop, 又没有数据。Redis 的消息队列不是专业的消息队列,它没有非常多的高级特性, 没有 ack 保证,如果对消息的可靠性有着极致的追求,那么它就不适合使用。没有 ACK 机制 - 例如在获取消息并已经删除了消息情况下, 正在处理消息的时候客户端崩溃了, 这条正在处理的这些消息就会丢失, MQ 是需要明确的返回一个值给 MQ 才会认为这个消息是被正确的消费了。如此循环往复,这便是作为队列消费者的客户端的生命周期。

2026-06-05 16:01:07 138

原创 什么是RAG?一文搞懂检索增强生成技术

在大语言模型(LLM)如ChatGPT、Claude、Gemini日益强大的今天,人们希望它们不仅能“生成”,还要“准确生成”。然而,LLM训练的数据往往是静态的、封闭的,这使得它们在面对时效性强、专业性高、上下文复杂的问题时,力不从心。在有些时候,企业内部或者事业部门内部的数据是不允许公开上传的,那么也就没有办法享受到大模型的服务,生产力也得不到解放。这时,RAG(Retrieval-Augmented Generation,检索增强生成)应运而生。

2026-06-05 15:58:59 195

原创 RAG-embedding

RAG飞速发展,成为连接“生成能力”与“外部知识”的桥梁,关于RAG的介绍可以参考什么是RAG?一文搞懂检索增强生成技术。前面我们介绍了RAG系统中的文档解析,RAG 的文档解析:PDF 篇,在解析文档得到数据后,由于数据规模很可能非常庞大,整体存储具有难度,并且在查询的时候可能仅仅和其中的一个或几个段落有关系,所以需要分块技术将解析后的文档内容切分为适当的片段一分钟读懂RAG的切分策略。切分完成后,需要将内容存储到向量数据库以供后续检索,下面我们就来看看怎么进行存储。Embedding(嵌入向量)

2026-06-05 15:57:09 207

原创 微服务负载均衡器Ribbon和LoadBalancer

通过实现 IRule 接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。

2026-06-05 15:52:54 231

原创 Elasticsearch 实战

这三个词,等下文章里会反复出现,这里用通俗的例子简单描述一下。其实就是媒婆给你介绍女朋友那一套。媒婆手上有十几份资料,得挑几个推给你。她不会瞎挑,他会看妹子的身高、长相、工作、和你的性格合不合、离家远不远。重点看哪几条,她也有自己的标准。LTR 里管这个叫特征定义。判断一条文档配不配得上用户这次搜的 query,到底该看哪几样?BM25 打多少分算一样,标题命中没命中算一样,片子热不热门、新不新,都算。把要看的这些列出来、说清楚每条怎么算出来,定义就完事了。光列出来没用,得真把数据整理出来。

2026-06-05 09:00:33 321

原创 IM分布式架构- 客户端到接入层有几道关

无状态化直接对应这一秒"接入层鉴权与连接归一"的工程难点:接入层 Pod 可随时重启升级(状态在 Redis,新 Pod 拉起用户重连即可)、单 IDC 挂了客户端可重连到另一个 IDC、横向扩容线性加机器。:连接层无状态化(Channel 状态外移到集中存储)、多 IDC 调度(用户连接可在不同机房漂移)、连接层和业务层解耦(接入层只管连接,业务消息透传)。(向自家 DNS 服务也得发 HTTP),所以几乎所有实现都做"启动时预解析"——App 一启动就把 IP 拉回来缓存,用户真正发消息时直接走缓存。

2026-06-04 09:35:13 186

原创 Agent开发入门

Prompt Engineering,翻译过来叫提示词工程,好像突然从写业务代码变成搞研究了。说实话,我一开始也觉得,这不就是会不会提问吗?后来项目跑起来以后,我才发现它没这么简单。尤其是做 Agent 的时候,Prompt 写不好,不只是回答丑一点,而是接口挂、JSON 解析挂、教师端页面挂、学生画像误判,最后后端还要背锅。我之前做高校学情分析 Agent 的时候,就被这个东西反复折磨。模型回答看起来挺像那么回事,但程序就是吃不进去。

2026-06-04 09:24:11 193

原创 Java网络编程实战-TCP/UDP Socket通信详解与高并发服务器设计

客户端端口号不建议使用固定值,因为咱无法控制客户端的电脑,万一这个端口号被占用了呢?当我们使用PrintWriter 的时候会出现一个问题,println仅仅是将数据发送了缓冲区内,并没有真正写入网卡中,这是因为JAVA在设计它的时候为了保证它的高效性,想让用户尽可能的多写入几次,再一起发送出去。是否需要关闭需要考虑它的生命周期是怎样的,服务器一般是7*24小时的运行的,只要你开着它你就需要保持DatagramSocket 的开启状态,而如果你的服务器关闭了,进程结束时自然会关闭所有的资源,无需手动结束。

2026-06-04 09:18:29 145

原创 Java 网络编程实战-从 Socket 到 Netty 的全面解析

代码语言:javascriptAI代码解释java复制编辑URL url = new URL("https://api.example.com/data");特性说明高性能异步非阻塞,IO效率高线程模型清晰Boss/Worker 分离可扩展性强Handler 链式结构支持多种协议TCP、UDP、HTTP、自定义协议社区活跃,文档丰富广泛用于开源项目Java 网络编程体系非常庞大,从最底层的 Socket 到 NIO/Netty 框架都值得深入研究。

2026-06-04 09:17:10 247

原创 Java 网络编程深度解析-从 Socket 到多线程通信实战

类名功能说明Socket客户端,用于连接服务端服务端,用于监听客户端连接请求IP 地址类Socket 和 ServerSocket 的基本使用TCP 和 UDP 协议通信多线程并发处理客户端连接实战案例(文件传输、聊天室等)性能优化建议(线程池、NIO)

2026-06-04 09:16:14 172

原创 Java网络编程-传统Socket编程深度解析

它把复杂的网络协议包装成简单的API,让程序员不用关心底层的数据包是怎么在网络中传输的,只需要调用几个方法就能实现网络通信。Socket的工作原理基本一样 - 它让两台计算机能够"通话",只不过传递的不是声音,而是数据。从简单的客户端-服务器通信,到复杂的多线程服务器,Socket都能胜任。你写好信,装进信封,快递员收件,分拣,运输,最后送到收件人手里。掌握了Socket,你就掌握了网络通信的核心原理。你不需要了解TCP协议的每个细节,也不用知道IP包是怎么路由的,只要会用Socket的API就够了。

2026-06-04 09:15:29 187

原创 AQS-共享锁

其实此处b也是存在并发的,例如线程1更换了head节点后,准备执行“锁释放”逻辑,正在此时,线程2正常锁释放后,唤醒了新的head节点(线程3),线程3又会执行更换head节点,并准备执行“锁释放”逻辑;这个问题看似不值一提,却相当重要,区别于独占锁,共享锁的锁释放是存在并发的,在高并发的流量下,一定要保证阻塞队列的第一个有效节点被激活,否则会导致阻塞队列永久性的挂死。共享锁的并发度为5,阻塞队列中有20个节点,只有head节点已被唤醒,且没有新的请求进入,我们希望在同一时刻,同时有5个节点处于激活状态。

2026-06-03 17:40:17 139

原创 深入理解Java并发框架AQS系列:条件队列

的判断,在多次并发测试时,会有较小的概率出现程序死锁的情况(作者电脑的环境是平均5万次调用会出现一次),为什么会出现死锁呢?我们还是拿长度为 5 的条件队列举例说明,在AQS内部会经历队列转移,即由条件队列转移至阻塞队列。,那么A、B、C线程中的某一个将被激活(根据其进入条件队列的顺序而定),从而执行后续的逻辑;与阻塞队列不同,条件队列没有常驻内存的“head结点”,且一个处于正常状态节点的。没有被唤醒的节点全部存储在条件队列上。我们初看AQS中的条件队列时,发现其提供了与JDK条件队列几乎一致的功能。

2026-06-03 15:57:21 429

原创 AQS详解

是一个抽象的队列同步器,AQS利用模板方法模式解决了开发者在实现同步器时的复杂问题,提供了一个通用的加锁解锁框架。

2026-06-03 15:56:06 380

原创 微服务架构设计中的设计模式、原则及最佳实践

事件驱动的架构本文将教给你如何从单体架构一步步演进到事件驱动的微服务架构。我们将从基本的设计入手,设计一个可以处理少量请求的单体架构的电子商务应用。编辑​架构设计之旅。

2026-06-03 11:13:14 412

原创 Netty实战教程

什么是通信协议?TCP通信的数据包格式均为二进制,协议指的就是客户端与服务端制定一个规则,这个规则规定了每个二进制数据包中每一段的字节代表什么含义。客户端与服务端通信的过程如下。客户端首先把一个Java对象转换成二进制数据,然后通过网络传输给服务端。这里的传输过程属于TCP/IP协议负责,与我们应用层无关。通信协议的设计1.第一个字段是魔数,可以理解为识别这条二进制数据类型的字段。在《深入理解Java虚拟机》中这么解释:使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑,因为文件扩展名可以随意地改动。

2026-06-03 11:11:49 253

原创 App 动态域名配置下发方案

App 动态域名配置下发方案(SM2 签名)本文档描述:通过 S3(建议经 CDN)下发 WebSocket、管理端、文件服务三类 URL 配置;配置为单一 JSON 文件,其中使用 SM2 数字签名校验除签名字段外内容的完整性与来源可信性;客户端内置初始 URL,拉取失败或验签失败时按约定回退。

2026-05-28 18:12:27 364 1

原创 Pulsar与Kafka对比全解析

通过 MoP,Apache Pulsar 可以支持原生 MQTT 协议,MQTT 应用程序就可以利用 Pulsar 的特性,例如 Apache Pulsar 计算和存储分离的架构以及 Apache BookKeeper 保存事件流和 Pulsar 分层存储等特性。除此之外,Pulsar 支持统一消息和流优先的应用程序,因而支持企业在不需要大量资源的情况下推出具有竞争力的革新性新产品,这也是 Pulsar 的显著优势。与 Pulsar 相比,Kafka 更成熟、更流行,拥有更大的社区和更完善的生态系统。

2026-05-28 17:11:12 365

原创 Mybatis-Plus和Mybatis-Flex区别

无脑选Mybatis-Plus的情况:传统企业级项目:需要稳定、成熟、经过大规模生产验证的解决方案。MP已经拥有数年的大规模应用考验,稳定性和社区资源都非常完善。极致的快速开发场景:项目几乎是标准的单表CRUD业务,对多表联查的需求极少。MP的开箱即用能极大提升开发效率。你的团队已经深度使用MP:已经有稳定的开发模板和技术积累。在这种情况下,全面换用Flex的边际收益可能不值得投入额外的学习成本。依赖代码生成器完成全套脚手架搭建的项目。

2026-05-28 15:51:11 361

原创 ThreadLocal 用了 WeakReference,为什么还会内存泄漏

先看 ThreadLocal 的存储结构ThreadLocal 本身不存数据,数据存在每个Thread对象里的一个字段上。是的内部类,结构类似 HashMap,key 是实例的弱引用,value 是你放进去的对象。这里有个关键设计:key 是弱引用,value 是强引用。

2026-05-25 15:55:29 255

原创 如何解决kafka topic数量过多带来的性能问题?

一个业务一个 Topic的设计思路,在业务逻辑上是清晰了,但在物理实现上,对来说就是一场灾难,如果你上云Topic成本会更高。你已经抓住了问题的核心,Topic(Partition)太多 -> 磁盘顺序写退化为随机写 -> 性能雪崩。而且你的业务还特别棘手,下游消费是的,不能简单地把所有日志混在一个 Topic 里。说几个取舍的方案。

2026-05-25 15:32:46 383

原创 为什么 Kafka Partition 分区越多,写入性能越差 ?

即使用的是 SSD,虽然没有磁头寻址的问题,但也有个PageCache 争用问题,Linux 内核的 PageCache 是全局共享的 LRU 缓存。除了无语没啥好说的,一点常识没有,盲目迷信分区越多,吞吐量越高,八股文不都写了 Kafka Partition 越多,写入性能反而越差吗?结果压测一跑,写入吞吐量不仅没升,反而像拉稀一样直线下滑,Broker 节点的 CPU 飙高,磁盘 I/O 更是直接拉满,甚至还报了。所谓的顺序写,就是每一个批次的数据在文件中连续写入,没有跳转。当分区数达到十万量级,

2026-05-25 15:32:05 391

原创 try-catch到底有没有性能开销

有一种说法是”try-catch 有性能开销,关键路径上不要用”。另一种说法是”try-catch 不抛异常的话没有开销”。这两种说法都不全对,开销在哪里要看具体用法。JVM 里,try-catch 的实现方式是在字节码里维护一张异常表(exception table),记录哪段代码对应哪些异常处理器。不抛异常的时候,代码直接顺序执行,不查异常表。JIT 编译器对没有异常的热路径做了充分优化, 的包裹本身开销可以忽略不计。开销来自于异常对象的创建:这行代码做了什么? 的构造方法调用父类 的构造方法,

2026-05-19 10:14:06 326

原创 Spring的Bean是线程安全的吗

现在,我们可以给出”Spring的Bean是线程安全的吗?Spring的Bean本身没有线程安全或不安全的说法,线程安全问题取决于Bean的作用域和使用方式。无状态的单例Bean是线程安全的有状态的单例Bean不是线程安全的原型Bean只有在每次使用都重新获取时才是线程安全的request、websocket作用域的Bean是线程安全的session作用域的Bean在同一个会话内可能存在线程安全问题实际开发中的最佳实践:优先使用无状态的Bean,这是解决线程安全问题的根本方法。

2026-05-13 00:02:53 348

原创 OA工作流-Activiti

OA工作流-Activiti(一)一、工作流定义工作流:一系列相互衔接、自动进行的业务活动或任务。OA工作流:建立于网络办公自动化基础上的事务行政审批,业务申请审批、公文、信息等的网上流转。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。不同于以往我们在仅仅进行增删改查(CRUD),我们还要对其进行 下订单–订单确认–财务收款–库管配货–运送 等等一系列操作。

2026-05-13 00:00:50 401

原创 Activiti工作流的详细介绍

Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。需要先画好流程图代码语言:javascriptAI代码解释/**

2026-05-12 23:59:26 305

原创 轻松构建你的第一个工作流

代码语言:javaAI代码解释try {.name("不知道在哪显示的部署名称").deploy();// 异常处理部署后会生成ProcessDefinition(流程定义),项目通过以下代码查询流程定义:代码语言:javaAI代码解释try {// 按版本排序// 遍历处理流程定义// ...// 异常处理和 deploymentid 一对一:$ ID_ = key + 部署次数版本 + id$既不是因为表的字段太多,也不是因为一对多,就是设计成了一对一关系。

2026-05-12 23:56:39 314

原创 提升springboot项目并发数

算笔账:每个请求耗时 100ms,200 线程的 QPS 上限是 2000。每个请求占用连接 50ms,10 个连接每秒最多处理 200 个请求。一个请求占用线程10秒,200线程的应用瞬间就没了。线程数不是越大越好,每线程占用 1MB 栈空间,800 线程就是 800MB。更坑的是,初始值和最大值不一样,JVM会动态扩容。不用缓存,你的并发上限就是数据库的上限。别问为什么是 50,你先改成 50,压测看效果,不够再加。,每次执行任务创建新线程,用完就扔。,任务扔线程池跑,主线程立马释放。

2026-05-12 23:50:40 343

原创 10大数据挖掘算法

该算法基于图论,将网页视为图中的节点,网页之间的链接视为边,并通过迭代计算每个节点的 PageRank 值来评估网页的重要性。PageRank 的核心思想是,一个网页的排名(即重要性)是由所有链接到它的网页的排名决定的,且一个网页链接到的其他网页越多,它的排名贡献就越小。:AdaBoost(Adaptive Boosting)是一种自适应的增强学习算法,它是集成学习算法-Boosting 算法的一种具体实现,通过组合多个弱学习器来形成一个强学习器,以提高预测精度和稳定性。

2026-05-12 16:59:46 411

原创 无人机协议

1. MAVLink协议。

2026-05-12 16:55:15 384

原创 ES分布式搜索引擎

elasticsearch底层是基于lucene来实现的。Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。。2004年Shay Banon基于Lucene开发了Compass2010年Shay Banon 重写了Compass,取名为Elasticsearch。如何使用拼音分词器?①下载pinyin分词器②解压并放到elasticsearch的plugin目录③重启即可如何自定义分词器?

2026-05-11 22:56:32 324

原创 大数据技术概述

1、HDFS(Hadoop分布式文件系统)HDFS是Hadoop体系中数据存储管理的基础,它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。简化了文件的一致性模型,通过流式数据访问,提供高吞吐量数据访问能力,适合带有大型数据集的应用程序。提供了一次写入多次读取的机制,数据以块的形式,同时分布在集群的不同物理机器上。HDFS 的架构是基于一组特定的节点构建的。这些节点包括 NameNode(仅一个),在 HDFS 内部提供元数据服务;若干个DataNode为 HDFS 提供存储块。

2026-05-11 22:55:26 405

原创 大数据技生态中Hadoop、Spark、Hive、HDFS之间的区别

Hadoop、Spark、Hive三者都是大数据相关的系统和技术,也属于数据管理系统的范畴,常见的问题无非就两个:1、数据怎么存;2、数据怎么算。为了方便理解这些技术,从单机时代来说,所有的数据都在一套服务器上,数据处理的任务都是IO密集型,也不是CPU密集型的,更谈不上分布式系统。在信息爆炸的时代,传统的单服务器已无法满足海量数据的存储和计算。问题在于如果有100台机器统一存储数据,该如何做管理呢?

2026-05-11 22:54:15 1008

原创 为什么说Feign是伪RPC?

有什么差别的,本人就不讲网络协议层上的事情了,大家可以理解成,基于TCP协议的Dubbo组件是直连,就两端打开通道后,直接发消息,消息的内容是彼此约定好的,比如前8个字节代表通讯文字的长度,后4个字节代表加密方式,之后是通讯的内容。顺带吐槽下,并发量在500qps的已经算很高了,一秒500个访问量,一分钟3万次,一个小时180万次,这样的日活用户是百万级别的,实际用户数至少千万级,大家可以想象下,能有这样用户数的app或模块能有多少?这其实是需要网络通讯协议支持的,就TCP和。,甚至之前的组件,是基于。

2026-05-11 22:49:47 230

空空如也

空空如也

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

TA关注的人

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