听写
This is the Peter Pan story, roughly speaking, as Peter Pan is this magical boy. Pan is the god of everything, roughly speaking... Right? So it is not an accident that he has …
Vibe Coding 实践:规范(Spec)驱动开发
如果无法避开,只能迎头痛击。 对于 AI coding 来说,我们有很多值得去学习和挖掘的工程实践。我看到很多个新的框架,给出的结构化思路都非常有趣,这让我想到一种理念,它相信:任务并没有那么复杂,复杂的是项目,复杂度不应该在任务的上下文中体现。也因此,强调持久化和分离,也就是单个 Agent 的近乎于无状态。
怎么集成消息队列的功能?
为什么要集成消息队列 在实时协作模块,每条修改记录都会生成一条日志数据,并在多个组件间流转。 前端提交的修改 JSON 会在后端解析为 Java 对象,通过通用 Service 层(为了解耦兼容)路由到 MQ Service。接着由 MQ 完成三件事:先写 Redis 并广播实现实时可见;再写 MySQL 实现持久化落盘;最后定期刷快照存入 Min…
涉及多数据源的双写问题
在协作空间的场景中,当用户使用 Excel 协作文档的编辑功能,会涉及到一个并发控制的问题。目前,我在设计上采用乐观锁,即使用 CAS + 版本号(Version)来规避这个读写冲突的问题。但是其中,还有很多问题值得讨论。 Excel 文件存在哪里?如何管理? 它是一个半结构化的数据,其文件本身存储在 MinIO 管理的对象桶中,元数据(数据项 I…
监控组件
这是一组配置 Prometheus + Grafana + Exporters + Alloy(kube-state-metrics) 的监控组件。 使用 shell 脚本配置。 设计: 基本组件由 systemd 守护进程统一管理自启动和生命周期。 gpu_exporter 由于一些库的历史原因,用 docker 管理; alloy + kube…
设计共享工作空间协作模块
永远不要试图用战术上的勤奋,去掩饰你战略上的懒惰。 ——雷军 背景 在设计团队协作存储模块时,我遇到了很多问题。 许多想法在我脑海中打架: 我想到非结构化的存储在 MinIO 中的文件,它们需要 MySQL 中涉及一个元数据表来进行维护吗? 如果需要,那么涉及到文件夹,文件夹这个抽象的概念又怎么引入这个表呢? 文件从属文件夹的设计又要怎么实现?在代…
最基础的传输控制
考虑至少要实现一个简单的并发控制吧亲! 使用的架构: Java 21 Redis MySQL 使用到的包: Hutool SecureUtil MD5 Java Spring Framework MutilPartFile/TransactionTemplate Redission Lock 使用的协议: HTTP 协议 对于一个使用最基础的 HT…
八股何以成其所是?
对于很多八股题来说,我现在考虑到,那么其实这是一个⌈场景⌋。 什么是场景?这是什么意思呢? 我想表达的是,虽然说现在大家都知道,如果要准备面试,肯定要先准备八股。而八股中会涉及到一些知识点的考察。 例如: MySQL 数据库可能会发生索引失效。为什么?怎么应对? Java 中的线程池有哪些核心参数?它如何调度任务?基于什么数据结构? Redis 的…
Spring Bean 加载顺序控制
Spring 框架中控制 Bean 的加载主要有以下几种管理手段。 以什么方式可以比较直观地看到具体的加载日志呢?
the King of 锁
麻雀虽小,五脏俱全。 多线程情况下。 基本锁升级 默认的锁升级情况如下: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁 为什么要有锁升级?这是应对不同的并发场景的策略。因为 Java 设计团队通过研究后认为:大多数锁修饰的对象,生命周期中大多只有一个线程在竞争。在默认修饰了 synchronized 的情况下,如果资源竞争并不激烈,在一个线程…
当我们在谈论优化时,我们在谈论什么?
预留。非常重要的一篇需要讨论的文章。 现实世界,衡量工程代码写得好不好,公认的标准是什么? 我不能说,单例模式一定比频繁创建实例好,这不是凭意志去理解的。而是要用数据去做支持的。因为资源是有限的,我们需要趋向于靠 trade-off 缩减成本。 量化指标: 执行效率: CPU 使用率 响应时间 内存状况 堆内存占用 GC 频率 并发压力 线程池活跃…
线程池源码
你怎么理解线程池? 线程池的设计? 我去读源码,我要先看它的构造函数。我去考虑作者的设计,我去想:作者认为这几个参数是核心的参数,因此将它作为了这个类的构造函数。作者想:如果人们用了我这个类,他们可能需要这些灵活的配置。因此写下了这些构造函数。 我想,在学习编程语言的过程中总要有一种信念,就是:这样的设计一定有它的道理存在。除非我有足够的证据推翻它…
通过 Spring Redisson 访问 Redis 集群进行分布式实验
环境: docker 的伪分布式 Redis 集群。主从分离,配备哨兵模式。 使用 Redisson 框架时,配置类的加载顺序问题 在 Spring 框架中,由于 IOC 的核心设计原则,我们理应将类的实例化生命周期管理交付给 Spring 进行管理。但是,对于 Spirng 自身的操作,我们也需要有一个比较清晰的认识。 在使用 redisson-…
数据库黄埔军校 MySQL
学习一个经典的设计,有利于我们在未来有一个更加清晰的认识。这是我们迈出向一个全新视界和全新设计的第一步,我们将学习一个完整、自洽、优雅的数据库软件—— MySQL。 几个博主的文章比较好地介绍了这个入门https://www.cnblogs.com/novwind/p/17489997.html https://www.cnblogs.com/be…
树的数据结构与递归
传递局部变量进行递归 示例代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val…
对象模型和锁
我们这里研究的对象模型是线程操作的最基本的对象, 从最基础的代码开始。 在这个实验中,我们探究的主要是 Java 8 的特性,使用了 org.openjdk.jol 包。以无锁状态的对象在内存中的实际存储情况为例作首先的熟悉。 Java 对象在内存的布局分析 接下来根据具体的输出进行分析。 java.lang.Object object inter…
Spring Boot 集成 Redis
使用的框架 Spring Boot Spring Data Redis RedisTemplates 中封装了很多对象类,我们通过对于类的一个操作,能够实现数据的填充。如 @Override public ValueOperations<K, V> opsForValue() { return valueOps; } Redis 中的数…
数据服务层的热重载实现
背景 qData 数据服务层采用动态路由设计,将 API 配置持久化至数据库表 DS_API,程序启动时通过 StartedUpRunner 一次性加载并注册至 Spring 的 RequestMappingHandlerMapping 内部维护的 MappingRegistry 中,实现灵活的路由映射。 问题 该加载逻辑仅在应用启动时执行一次。当…
关于 qData 数据中台内存性能问题的分析论文报告
为了避免对于生产环境当前的部署情况以及压测时对于其他资源的侵占导致的可能出现的各种 bug,我选择在我自己的主机上重新部署 qData 的这个项目。 这个花费了一定的时间,但是也让我感受到了本地开发的 IDEA 的重要性,它有很直观的图形界面,也易于调试,只是稍微需要学习一下,并且不同的 Java 版本可以通过项目结构进行管理,不需要在环境变量里面…
怎么快速写一个接口
为了节约我的认知资源,避免过度的消耗,我需要非常快地把一些工作总结成方法论。否则按照我的性格来说,很容易在混乱的情况中不断内耗,直到先把自己燃烧殆尽。 先看需求。 我需要哪些出参?我需要哪些入参? 首先定义出参和入参。
数据服务层 API 具体源码实现
对于数据中台描述,我需要将情况讲清楚。 从一个具体的 Java 的 Data Object 对象的实现层面。 启动流程 qData 使用的是 Spring Boot 的框架。 在实现上,数据服务层的抽象使用 ApplicationRunner 接口实现,也就是说, DS API 的持续服务提供功能的初始启动状态是作为组件启动的。 具体情况中,我们的…
数据中台
最近要开展新的项目了。预留出这个文档。 首先来讲一下 数据中台是由于微服务逐渐兴起而出现的一种新的数据 qData 项目 qData 项目 API 鉴权 在 qData 中,外部应用要访问发布的 API,要使用应用管理模块。也就是说,把注册和上线了的 API 进行发布管理。通过官方手册可知,首先我们需要通过应用编号(client_id)和应用密钥(…
谈论云原生
实际上,地方国企和互联网企业的使用的技术是大不相同的。在这里,我们强调的是一个项目的闭环,面对用户时细节上的准确性和专业性,这当然是非常重要的。但是在互联网企业里面有一个我在当前环境完全接触不到的一整块核心技术——⌈云原生⌋、⌈高并发⌋、⌈架构设计⌋。 也许在我没有来到这里之前,这个词语对我来说还是术语层面的,但是在实际的开发学习过程中,我发现了为…
杂谈-原型设计
我突然有了一种⌈啊哈⌋的感觉。 我突然知道为什么非关系型数据库现在为什么如此受欢迎了。首先是不断变更的业务需求,对快速产出原型的急迫,也因此学习掌握一门非关系型数据库的应用方法是非常重要的。 程序设计也许应该跑在数据库后面,这是我的今天的一点感叹。当然同样重要。只是我发现单纯产出产品原型时,也就是主要只写前端的一些页面的时候,实际上大部分内容就是围…
办件生命周期论
水35公升、碳20公斤、氨4公升、石灰1.5公斤、磷800克、盐250克、硝石100克、氟7.5克、铁5克、硅3克,还有其余15种微量元素……这就是一个成年人身体的组成物质。 即使是小孩,只要有这些材料,花不了几个钱就能在市场上买齐。人这种生物,原来是可以用这么便宜的价格买到的吗? ——《钢之炼金术师》 了解一个软件,作为认识者而不是创造者,先入为…
Java 反射
阿莱夫的直径可能只有一英寸,但所有的空间都在那里。我从宇宙的每一个角度清楚地看到了它。我看到了地球上所有的镜子,但没有一个能映照出我;我看到了一只手精致的骨骼结构;我看到了自己黑色血液的循环;我看到了爱的结合和死亡的改变。我从各个点和角度看到了阿莱夫,在阿莱夫中我看到了大地,在大地中又看到了阿莱夫。我感到头晕目眩,流泪了,因为我的眼睛看到了那个秘密…
术语和逻辑
Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt. 语言的边界就是思想的边界。 ——《逻辑哲学论》 维特根斯坦(德国哲学家,1889-1951)
在 Java 建构、映射一个实体
这一篇会主要围绕一些技术细节展开,核心任务是构建一个完整的、自洽的且具有完整生命周期的实体类。 本篇内容为⌈设计人员的增删改查功能⌋。 在本 Spring Boot 框架中,主要使用的包为: Mybatis-plus Lombok Web 开发核心注解 按照主要负责的功能,分为多个层次来认识这些: 启动与配置 @SpringBootApplicat…