- 博客(211)
- 资源 (7)
- 收藏
- 关注
原创 Spring状态机实战详解:从零构建订单状态管理系统
在现代企业级应用开发中,状态管理是一个常见且重要的需求。无论是订单处理、工作流管理,还是业务流程控制,都需要一个可靠的状态机来管理复杂的状态转换逻辑。Spring State Machine作为Spring生态系统中的一员,为我们提供了强大而灵活的状态机解决方案。本文将通过一个完整的订单状态管理系统,深入解析Spring状态机的核心概念、实现原理和最佳实践。我们将从项目搭建开始,逐步实现一个功能完整的状态机应用,并详细分析每个组件的作用和实现细节。我们要实现一个电商订单的状态管理系统,订单的生命周期包含以下
2025-05-30 15:04:29
681
原创 Spring状态机监听器
项目复杂度:复杂项目推荐适配器方式团队偏好:声明式编程偏好选择注解方式监听需求:全面监听选适配器,精确监听选注解维护性要求:长期维护的项目推荐适配器方式在实际项目中,建议根据具体需求选择合适的方式,甚至可以混合使用以发挥各自的优势。
2025-05-30 14:54:54
575
原创 QMQ顺序消息的实现机制
功能模块核心类源码位置主要职责路由分组消息路由到固定连接序列号管理全局序列号分配顺序执行保证事件顺序处理消息存储MessageLog顺序写入存储内存管理内存中消息顺序管理消费管理消费序列号管理消费队列顺序消费控制。
2025-05-28 22:57:24
314
原创 QMQ事务消息的实现机制
QMQ的事务消息机制通过和三个核心类实现。这种设计确保了消息的发送与业务操作的一致性,适用于高吞吐量和高可靠性的分布式系统。
2025-05-28 20:02:40
409
原创 QMQ有序消息实现机制
已分析QMQ有序消息的实现机制,确认业务ID(businessId)通过BaseMessage的attrs动态存储,序列号(sequenceId)由MessageTracker动态生成并设置。关键实现包括路由一致性、顺序写入和事务支持。该机制通过业务ID路由和序列号生成,确保了消息的顺序性和可靠性。
2025-05-28 19:51:08
291
原创 QMQ有序消息的实现机制深度解析
魔数(1B)| 长度(4B)| 序列号(8B)| 业务ID(8B)|| 消息体 |@Override使用变长编码压缩数字字段支持snappy压缩消息体。
2025-05-28 19:41:49
570
原创 QMQ有序消息的实现机制深度解析
/ 全局递增序列号。| 消息大小 | 并发连接 | 吞吐量(msg/s) | P99延迟(ms) |- 路由决策:Hash(businessId) % queueCount。| 魔数(1B)| 长度(4B)| 序列号(8B)| 业务ID(8B)|- 配置:worker.thread.count=CPU核数*2。1. 路由分组:相同业务ID的消息始终路由到同一队列。| 事务ID | 状态 | 消息数 | 创建时间 |
2025-05-28 19:24:19
867
原创 美团Leaf、百度UidGenerator及原生Snowflake算法对比分析
以上方案均已在生产环境验证,开发者可根据业务规模(预估QPS)、基础设施(是否具备ZK/Redis)及安全需求(是否允许ID趋势递增)综合选择。优化时间分配:采用相对时间(当前时间-固定起始时间),减少时间戳占用位数,扩展机器ID至22位。当当前Buffer使用率达20%时触发预加载,确保无间隔ID供应。通过调整比特分配,可定制ID结构(如延长机器ID支持4百万节点)通过异步线程预加载下个号段,避免高并发下请求阻塞。通过号段预加载和本地缓存,显著降低数据库压力。
2025-05-20 12:07:54
605
原创 深度解析:Java选择UTF-16的底层机制与BMP/代理对技术逻辑
Java选择UTF-16是历史局限性与技术权衡的综合结果。BMP的定长特性奠定了高效字符串操作的基础,而代理对机制以可控的复杂度代价实现了Unicode扩展。尽管UTF-8在存储和传输中更具优势,但UTF-16在内存计算密集场景(如日志处理、文本编辑器)仍不可替代。开发者需根据场景选择编码策略,并在处理补充字符时警惕代理对的隐形复杂性。
2025-05-15 12:08:58
710
原创 UTF-16 与UTF-8的区别? 为什么字段串长度不使用UTF-8?
字符串长度本质:Java的length()反映UTF-16代码单元数,与物理字节长度无关编码选择逻辑:UTF-16的内存操作效率与历史兼容性使其成为Java的默认选择,而UTF-8在存储和传输中占优实践建议:内存处理:依赖UTF-16的高效随机访问持久化存储:使用UTF-8以兼容多语言环境编码转换:显式声明编码避免隐式转换风险通过理解编码机制与性能权衡,开发者可更高效地设计跨语言、跨平台的文本处理系统。
2025-05-15 11:55:40
518
原创 深度分析:内存与磁盘的容量计算差异对Java代码的影响
内存操作严格使用1024进制的返回值基于二进制标准磁盘交互优先使用1000进制返回的字节数是物理存储的真实值混合场景显式声明单位变量命名增加单位后缀(如vs关键位置添加单位注释// 内存缓冲区(二进制MB)// 磁盘限制(十进制MB)通过理解内存与磁盘的容量计算差异,开发者可避免资源计算错误导致的系统性风险。
2025-05-15 11:47:42
595
原创 Java大日志切割实战:策略、陷阱与最佳实践(2025年5月更新)
Logback UTF-8编码配置。: Logback时间+大小切割策略。: Java大文件切割实现。:使用Logback的。: 递归解决中文乱码方案。(基于线程池优化): 安全字节截断算法。
2025-05-15 11:40:25
459
原创 深度分析:不同编码导致字节长度差异的本质原因
优先使用 UTF-8:确保多语言兼容性,避免数据丢失。慎用默认编码:显式指定编码(如),防止环境差异导致行为不一致。日志系统设计:若需压缩存储,可对非关键字段使用单字节编码,但需权衡可读性损失。
2025-05-15 11:33:47
707
原创 深度解析:log.length() 与 getBytes().length 的本质区别
length()是逻辑视角:聚焦字符结构,与编码无关。是物理视角:依赖编码规则,反映实际字节占用。数值相同 ≠ 意义相同:用户案例中的巧合数值掩盖了底层机制的本质差异,需根据场景谨慎选择。
2025-05-15 11:31:12
581
原创 Spring 的 @Scheduled 注解是否支持失败重试
虽然@Scheduled本身不支持失败重试,但通过Spring Retry 库手动重试逻辑或异步任务配置可以灵活实现该功能。实际开发中推荐优先使用@Retryable注解,其配置简洁且支持退避策略,适用于大多数场景。
2025-05-12 16:15:14
673
原创 Galera多主集群的实现原理与机制
所有节点需存储全量数据,不支持水平分片(Sharding)。若需分片,需结合其他技术(如Vitess)。负责节点间通信,使用消息广播(如4567端口)和状态传输(4444/4568端口)。:使用乐观锁和事务ID(UUID + 序列号)检测冲突,最终一致性。Write-Set发送到其他节点,验证冲突(基于事务ID和行锁)。事务在本地执行后,将变更集(Write-Set)广播到其他节点。其他节点验证并应用Write-Set,实现同步复制。根据业务规则(如用户ID哈希)将请求定向到特定节点。
2025-05-08 11:46:08
386
原创 腾讯云TD-SQL(MySQL内核版)与原生MySQL/MariaDB在Kubernetes环境中的深度对比分析
TD-SQL现已支持「冷热数据分层」,可将历史数据自动归档至COS,进一步降低存储成本达60%
2025-05-07 20:07:37
420
原创 腾讯Kona-8、阿里Dragonwell和华为毕升JDK的对比
注:数据截至2025年5月,各版本具体表现可能随更新有所变化。建议根据实际业务场景进行基准测试验证。
2025-05-07 16:29:11
253
原创 mac上安装maven 3.6.3
会提示找不到该版本。这是因为Homebrew的版本策略发生了变化,现在只维护Maven的最新稳定版本。这将安装当前最新的Maven版本(如4.x)。大多数情况下,新版本都能良好兼容旧项目。根据您提供的错误信息,Homebrew已经移除了对Maven 3.6.x版本的单独支持。然后通过jenv来管理不同版本的Maven和JDK。最新Homebrew安装Maven的现状。方案1:安装最新版Maven。方案2:手动安装特定版本。
2025-05-07 16:07:22
328
原创 日志中的 requestId/traceId是如何传递的?SLF4J的MDC(Mapped Diagnostic Context)机制
用户希望详细了解SLF4J的MDC(Mapped Diagnostic Context)机制。MDC是SLF4J提供的一种用于在多线程环境中传递上下文信息(如requestid)的功能。requestid%X{key}MDCMDC接下来,我将详细整理这些内容并呈现给用户。
2025-05-07 15:39:06
508
原创 MyBatis的2038年问题的讨论
建议优先采用升级框架版本+数据库类型调整的组合方案,在最小改动成本下获得最大兼容性提升。对于无法立即升级的系统,可通过强制使用字符串时间格式作为临时过渡方案。
2025-04-23 11:49:44
337
原创 Idea配置中的“Transparent native-to-ascii conversion”选项的作用
现代开发环境的默认配置(如UTF-8)和程序内部处理机制,使得两种设置均能支持中文的国际化展示。无论是否勾选,中文正常显示的核心在于。
2025-04-22 12:15:41
231
转载 UUID.randomUUID()简单介绍-面试题
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需...
2018-11-05 09:59:00
3462
原创 redis分布式锁实现-面试题
1 加锁(key自定义,value为uuid)Boolean setNX(byte[] key, byte[] value);2 设置过期时间(key,timeout,unit)public Boolean expire(K key, final long timeout, final TimeUnit unit) { final byte[] rawKey = rawK...
2018-11-05 09:52:54
10642
原创 京东-面试题目-02
abstract class CCALSS { public int a;// 可以包含非抽象属性 //public abstract int b; // 1 编译错误,字段不可用abstrct修饰 public void c(){} // 可以包含非抽象方法 //public abstract void d(){}//2 编译错误,抽象方法不可以有body ...
2018-11-04 23:39:43
387
原创 京东-面试题目-01
import java.util.HashMap;class A { public A(){ System.out.println("a construction"); } { System.out.println("in a class"); } static { System.out.print...
2018-11-04 23:30:05
533
转载 Linux面试题汇总-3
1.# 表示权限用户(如:root),$ 表示普通用户 开机提示:Login:输入用户名 password:输入口令 用户是系统注册用户成功登陆后,可以进入相应的用户环境. 退出当前shell,输入:exit2.useradd netseek 添加一个netseek用户 passwd netseek 给netseek这个用户设置密码. (/etc/passwd /et...
2018-10-31 22:13:46
284
转载 Linux面试题汇总-2
一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统.3. Linux文件系统中每个文件用 i节点来标识.4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块.5. 链接分为: 硬链接 和 符号链接 .6. 超级块包含了i节点表 和 空闲块表等重要的文件系统信息....
2018-10-31 21:45:57
357
转载 Linux面试题汇总-1
1. cron 后台常驻程序 (daemon) 用于: A. 负责文件在网络中的共享 B. 管理打印子系统C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2. 在大多数Linux发行版本中,以下哪个属于块设备 (block devices) ?A. 串行口B. 硬盘 C. 虚拟终端D. 打印机 3. 下面哪个Linux命令可以一次显示一...
2018-10-31 20:53:30
527
VC++视频采集资料
2013-09-28
Java7学习笔记--林信良(代码)
2013-06-10
简单学生选课系统(MFC+sqlserver2005)
2012-12-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人