笔记与页面

简历

个人信息

姓名:廖梓鉴

工作经验:6年

电话|邮箱:15970126646 | lzj960515@163.com

个人网站:https://zijiancode.cn

学历|专业:本科 | 材料物理

专业技能

  • Java基础扎实,对并发编程、集合等基础框架有深入理解,掌握常见的数据结构和算法、设计模式,深度研究过ReentrantLock、Samephore、BlockingQueue、线程池等相关源码。
  • 深入理解JVM底层原理,熟悉JVM各种垃圾收集器的使用以及核心参数的调优,能够使用常用的命令如jmap、jstack、jstat或者Alibaba Arthas 诊断工具对线上系统进行调优。
  • 深入理解Spring的设计原理及底层架构,精读过IOC、AOP相关源码,能够对Spring生态组件进行自定义扩展。
  • 深入理解MySQL的底层数据结构和事务隔离机制,能够MySQL进行性能调优。
  • 熟悉SpringBoot、SpringCloud Alibaba微服务技术,研究过Nacos、Open-Feign、Gateway等部分组件源码。
  • 理解Redis的核心数据结构,熟悉多级缓存架构,熟悉如缓存雪崩,缓存穿透,缓存失效,热点缓存重建等高并发场景。
  • 熟悉Zookeeper选举机制及典型应用场景,如分布式注册中心,分布式锁等,研究过部分源码。
  • 熟悉Elasticsearch,研究过倒排索引原理、分词算法,实现过基于Elasticsearch的低代码引擎。
  • 熟悉微服务架构,主导过多个微服务系统的架构设计,解决过多种分布式问题,如分布式调用链度追踪,分布式日志,分布式任务等。
  • 研究过高性能IO通信模型以及相关开源组件Netty源码,熟悉Netty线程模型。
  • 研究过RabbitMQ、Kafka、RocketMQ等相关MQ技术,熟悉消息积压,消息重复消费等问题解决方案。

工作经验

重庆凯桥信息科技有限公司

工作时间:2020.10-至今

工作职位:技术委员会主席

工作描述:

  • 基础设施建设

    • 中间件
    • 自研组件
    • 知识库
  • 系统架构设计与开发

  • 技术难点攻破

  • 线上系统性能优化

中软国际有限公司

工作时间:2019.09-2020.10

工作职位:Java开发工程师

工作描述:

  • 负责组件云平台的架构设计及功能开发
  • 负责微信公众号平台的系统重构及功能开发

深圳希创旺思电子科技有限公司

工作时间:2018.07-2019.6

工作职位:Java开发工程师

工作描述:

  • 负责供应链系统的核心开发

项目经验

互联网医院智慧医院标准版

项目名称:互联网医院智慧医院标准版

项目介绍:为进一步缓解或解决医院三长一短问题,让患者少排队或不排队,提升患者的就医体验,我们需要建造一个高效、多医院、统一用户的医疗平台。我们希望通过互联网医院智慧医院标准版优化线下服务、融合线上与线下服务流程,为患者提供更优质的医疗服务。

技术栈:SpringBoot、SpringCloud Alibaba、Mybatis-Plus、MySQL、Redis、Elasticsearch、Sentinel、Xxl-Job、Skywalking、Docker

我的贡献:

1、系统架构设计

(1)系统整体设计

从业务层面、流量层面进行微服务划分,统一技术栈。

  • 使用Nacos作为注册中心进行服务注册、服务发现
  • 多节点网关提供流量统一入口
  • 使用ELK进行分布式日志收集,解决日志排查困难问题
  • 使用Skywalking做分布式调用链路追踪,快速定位线上问题
  • 使用Xxl-Job作为分布式任务调度中心,统一管理调度任务
  • 使用Sentinel做服务熔断降级
  • 服务容器化部署,使用GitLab+Runner进行CI/CD

(2)挂号服务设计

在系统中,挂号业务流量大,并发高,而挂号业务依赖于从医院接口查询号源。其中有两大问题:

  • 医院号源提供给多方使用,故无法简单的将所有号源缓存到系统中
  • 医院接口并发小、响应慢

基于上述条件,系统设计了多级缓存

  • 一级缓存缓存时间低,保证号源数量虽然存在差异,但是差异不大
  • 二级缓存缓存时间长,保证缓存不会击穿。
  • 同时使用分布式锁,保证某个缓存失效后只有单个线程同步号源,保证医院系统的稳定性。
  • 使用Sentinel,对不同的医院设置不同的限流策略,保证系统不会因为某个医院系统故障发生雪崩。

(3)登录授权设计

为更广泛的为患者提供服务,系统支持患者从多渠道(微信、支付宝、第三方)登录。

而不同的渠道登录方式、登录信息不同,患者的产生的业务却应当是跨渠道的(在微信上产生的业务,在支付宝上也能看到)

  • 系统设计平台用户池,将不同渠道的用户信息与平台用户绑定,患者开展的业务都使用平台用户完成
  • 使用模板方法模式设计统一的登录流程,保证登录流程规范性。
  • 使用策略模式获取不同渠道的登录信息,以区分不同渠道的特性,提高登录业务的可扩展性。

2、系统性能调优

(1) 挂号服务性能优化

服务情况:

  • 数据库:院内数据库(延时40ms)

  • 实例数:3个,每个实例的服务器为2核,并且被其他服务共用

  • 内存:2G(年轻代与老年代比值:2:1)

  • 垃圾收集器:ParNew + CMS

  • 挂号流程简述:查询号源(多级缓存) -> 锁定号源 -> 支付

优化前:

  • 系统可用性:0.70
  • 最大平均响应时间:4500ms
  • 最大响应时间:45000ms

优化手段:

  • 使用skywalking查找慢接口,优化sql
  • 调整请求线程池数量
  • 调整流量负载比例,优化cpu使用率
  • 调整内存,优化gc

优化后:

  • 系统可用性:0.99
  • 最大平均响应时间:60ms
  • 最大响应时间:600ms

(2) 医生服务内存优化

问题:频繁出现OOM异常

优化手段:

  • 使用skywalking查看服务gc情况,发现服务频繁发生full gc
  • 导出服务dump日志,使用jvisualvm进行分析,定位到具体业务代码问题
  • 对该业务流程的代码进行优化

3、针对开发情况对开源框架扩展

(1) 自定义路由策略

标准版作为平台级项目,常常会同时面临不同医院的不同需求,面对这样的情况,多版本同时开发是一种常态,而问题在于开发环境却只有一套,这就会导致开发人员在调试不同版本时会频繁将服务上下线,这实在太不优雅。

解决思路:扩展Gateway和Ribbon的路由策略

  • 自定义VersionLoadBalancerClientFilter用以替换Gateway中LoadBalancerClientFilter
  • 自定义VersionRule用于替换Ribbon中的路由策略

达成效果:前端开发人员只需要在请求头中传入指定的版本号,路由策略将自动选择对应版本的服务进行路由。

凯桥组件库

项目介绍:kq-universal为凯桥后端组件库。以“一切可以拷贝的代码都应得到复用”为理念,将凯桥常用的工具,普遍的业务场景,进行了抽离与组件化,现已经将部分组件(近20)开源至GitHub,组件库的开发使得我们能够做到:

  • 统一技术栈
  • 避免重复开发,降低维护成本
  • 技术规范化

技术栈:SpringBoot、Redisson、Mybatis

我的贡献:

组件设计与开发

1、数据库加解密组件

在医疗领域,数据库敏感信息必须要加密存储,而将数据加密入库,出库解密,这是一个通用且繁琐的操作,该组件通过Mybatis拦截器特性做到无侵入式将数据加密入库,查询数据时解密,极大降低了开发成本。

2、Redis组件

我们常常会使用Redis做数据缓存,做分布式锁,Redis组件规范了Redis的使用方式,并通过Redisson实现了一系列的注解式分布式锁,使用者只需在方法上增加注解,即可达成分布式锁效果。

3、延时任务组件

关于延时任务,我们总是在定时任务轮询或者消息队列中做取舍,而延时任务组件则集成了这两位的优点,基于时间轮数据结构,做到不依赖外部中间件且任务执行时间精确。

4、流程引擎组件

市面上的流程引擎可能功能复杂且比较重,也可能需要重新定制开发,该组件为凯桥业务场景而设计的流程引擎组件,充分发挥了流程引擎特性,让项目只专注与业务本身,无需关心流程相关功能。

其他组件您可在GitHub中查阅

自我评价

  • 热爱技术,喜欢钻研,研究过众多开源框架源码,如Spring, Netty, Nacos等
  • 热于分享,在公司的语雀知识库发布了众多文章,常常进行培训,与同事们分享技术
  • 良好的编程习惯,优秀的编码能力,在公司制定开发规范,进行Code Review
  • 逻辑思维敏捷,业务能力强,善于发现业务痛点,提出有效的解决方案
记于阿紫的博客
← 返回文章归档