Skip to content

写入简历中

省运慧

动态编排框架

  1. 利用模板和策略模式将项目初始化行为进行封装,只需实现接口即可,统一管理执行动作和顺序。通过ApplicationRunner在Spring容器启动完成后按order顺序执行初始化任务(如缓存预热、配置加载),确保初始化操作的可控性和可维护性。

  2. 利用组合模式和树形结构设计验证基础组件,实现统一管理复杂的业务验证逻辑。将购票前的多个验证环节(库存验证、用户资格验证、场次验证等)组装成树形结构,支持灵活的验证规则组合和复用,符合开闭原则。

基因标识法

利用计算机二进制特征,设计基因法将订单编号和用户ID融合在一起,对订单表进行分库分表,能够支持订单编号和用户ID的查询,且不发生读扩散问题。通过将分库基因和分表基因嵌入订单号的不同位置,实现了数据的均匀分布和多维度查询能力。

将分库和分表的基因融入订单编号,使得基因位分离,实现分库分表下数据均匀分布,资源利用率从50%提升到100%。通过将分库基因和分表基因嵌入订单号的不同位置,避免了数据倾斜问题,实现了各分片的负载均衡,大幅提升了资源利用率。

??? 在物理分片和数据之间,设计一层虚拟分片路由映射:"数据→虚拟分片ID→路由表→物理库表",实现在分库分表情况下,数据能够灵活扩容。通过虚拟分片层的解耦,在物理扩容时只需调整路由映射关系,无需数据迁移,大幅降低了扩容成本和风险。

订单超时关闭

  1. 在Redisson提供的延迟队列基础上,利用分片思想结合线程池进一步提升处理任务的效率。通过分片将延迟任务分散到多个队列,配合线程池并行消费,实现订单15分钟超时自动关闭,大幅提升了延迟任务的处理能力。

  2. 利用设计的分布式延迟队列功能,当订单超过15分钟后仍未支付,则自动取消订单。通过Redisson延迟队列+分片思想+线程池的组合,实现了高性能的延迟任务处理,确保订单能够按时关闭并释放库存,提升了库存周转率。

分布式链路问题定位

设计分布式链路ID,在上千个服务中通过此ID能够快速找到对应的请求链路,极大提高排查问题的效率。基于MDC机制实现链路ID的全链路透传,配合ELK日志系统,能够快速定位分布式环境下的问题根源。

利用模板和装饰者模式对线程池进行封装定制,利用TransmittableThreadLocal原理进行优化,使其能够支持MDC和ThreadLocal中的数据传递,分布式链路ID也能够正常传递。解决了线程池场景下上下文丢失问题,保证了日志完整性和链路可追踪性。 技术精华-ThreadLocal InheritableThreadLocal TransmittableThreadLocal全攻略

●为了解决注解式锁粒度过粗的问题,利用命令模式实现了基于函数式编程的分布式锁工具类。实现了锁生命周期的自动化管理,规避了手动释放锁可能引发的死锁风险,并支持多样化的锁超时降级策略,核心业务的锁持有时间。

购票系统

多级缓存 竞争回源

对Redis进行高效封装,对参数进行严格校验,让键能够统一管理,简化对象序列化和反序列化过程。设计统一的键命名规范(业务模块:功能:标识),支持自动过期时间管理,提供丰富的数据结构操作API,降低开发成本并减少人为错误。

利用Redis的多种结构(包括:String、Hash、List)并且利用分片思想保存节目详情数据、票档、座位数据。实现在缓存数据的前提下,也能保证系统的并发能力。通过分片设计将热点数据分散存储,避免单Key成为性能瓶颈。

引入本地缓存Caffeine进一步缓解Redis访问压力,并利用演出时间来设计数据淘汰策略,解决了内存压力过大的问题。通过Caffeine+Redis+数据库的三级缓存架构,并根据演出时间动态调整缓存过期时间,在保证数据时效性的同时最大化了缓存命中率。

通过使用读写锁、双重检测机制、多级缓存,引入**"先查询,后加锁"的方案,解决缓存击穿**问题。在热点数据失效时,通过读写锁控制只有一个线程去加载数据,其他线程等待或从多级缓存获取,避免大量请求直接打到数据库。

高并发分布式锁压力 MQ异步更新DB

将数据库更新余票的行为转移到Redis执行,既能防止超卖问题又能进一步缓解数据库压力,提升系统吞吐量。通过Lua脚本保证库存查询和扣减的原子性,配合Kafka异步将扣减结果同步到数据库,实现高性能的库存管理。

通过Lua+Redis操作结合Kafka中间件进行异步创建订单,吞吐量提升了26%,并且可以保证不会出现余票超卖的问题。通过将同步的订单创建改为异步处理,释放了主流程的压力,同时通过Lua脚本保证了库存扣减的原子性。

分布式锁增强组件

工厂模式+策略模式封装分布式锁

利用工厂模式策略模式提供多种类型的锁(包括:公平锁、非公平锁、读锁、写锁)。提供自定义注解+AOP、方法操作、接口实现三种加锁方式,并兼容事务场景。通过@Order控制切面执行顺序,确保加锁在事务开启前、释放锁在事务提交后,解决了锁与事务的时序问题。

命令模式封装本地锁