下面是作者根据自己15年的互联网电商经验总结的,Java程序员进阶架构师的路线图,希望对初入职场的同学和对自己技术发展路线不太明确的同学有所帮助!
Java程序员进阶架构师学习路线图(双击查看清晰大图):
详细介绍如下:
JVM
基本参数调优(Xmx,Xms,Xss,-XX:NewRatio,-XX:SurvivorRatio等)
GC收集器选择(根据系统特点,比如是吞吐量优先还是响应时间优先,老年代和新生代选择什么收集器,选择Serial,Parallel,CMS还是G1等)
常见JVM问题(OOM,内存泄漏,频繁Full GC,线程阻塞等)
关键命令应用(Jmap,Jstack,Jstat,jps,jinfo等)
内存模型
Java基础
集合类
锁(自旋锁,可重入锁,偏向锁,乐观锁,悲观锁等等概念的理解)
并发编程
并发包(java.util.concurrent)
原子包 java.util.concurrent.atomic
4. 设计模式
数据迁移
数据结构不变(加从库)
数据结构改变(双写双读)
详见作者原创文章《服务化带来的问题---之数据迁移经历》
数据一致性
强一致(XA,两阶段提交)
最终一致,补偿机制(Tcc,Saga,Seata,事务型消息等,详见作者原创文章《服务化带来的数据一致问题---分布式事务,事务型消息》)
幂等性(一个操作访问多次,结果都一样。比如支付接口要保证幂等,由于网络等原因接口重试后,不能多次扣款)
服务网关(Zuul,Gateway等)
流控,限流(整体限流,避免突发流量给系统带来过大压力;对用户限流,防脚本、机器人刷单)
熔断(下游服务出问题,上游服务不再继续发送请求到下游服务,直接快速返回默认数据,避免线程长时间阻塞造成线程池线程耗尽;下游服务压力得到缓解,恢复几率也会变大)
鉴权(比如token验证,可以在网关层处理)
路由(根据请求路径等信息,将请求路由到相应的服务上)
黑白名单
接口聚合(将同一个页面多个接口的返回结果聚合成一个返回给前端,减少网络访问频次)
服务治理
服务发现(在服务节点上下线过程中,自动发现服务节点,无需人工介入)
负载均衡
限流(网关层整体限流,避免突发流量给系统带来过大压力;对用户限流,防脚本、机器人刷单)
熔断(开源熔断组件hystrix、resilience4j等。下游服务出问题,上游服务不再继续发送请求到下游服务,直接快速返回默认数据,避免线程长时间阻塞造成线程池线程耗尽;下游服务压力得到缓解,恢复几率也会变大)
资源隔离(分组部署,jvm内部线程隔离)
配置中心(配置和代码分离,灵活支持生产,测试和开发环境;提高安全性,提高修改配置效率)
服务降级(除了,限流、熔断等;还可以对部分性能差的接口和功能设置开关,比如我们会在大促期间关闭物流查询接口,来保证系统性能;降级方案内容太多了,这里不做过多描述)
应用缓存
缓存分类
本地缓存(应用内部的缓存,比如guava cache等,特点:本地内存直接读取,速度快;存储量小,适合少量且相对稳定的数据;分布式多节点部署,可能会出现多个节点本地缓存数据不一致的情况)
缓存中间件(如Redis等,单独部署的中间件,存储量大;遇到瓶颈时可以做集群分片)
2. 常见问题
缓存穿透(对于数据库中根本不存在的值,请求缓存时要在缓存记录一个空值,避免每次请求都打到数据库)
缓存热点(有些热点数据访问量会特别大,单个缓存中间件节点(例如Redis)无法支撑这么大的访问量。如果是读请求访问量大,可以考虑读写分离,一主多从的方案,用从节点分摊读流量;如果是写请求访问量大,可以采用集群分片方案,用分片分摊写流量)
缓存雪崩(在某一时间段缓存数据集中失效,导致大量请求穿透到数据库。可以在初始化数据时,差异化各个key的缓存失效时间,失效时间 = 一个较大的固定值 + 较小的随机值)
异步消息
应用场景(异步处理,流量消峰,一对多通信,日志处理,系统解耦等)
带来的问题(过多的异步消息使用和滥用,会让代码阅读者感觉混乱,使系统的调用关系变复杂 ,系统可维护性会变差)
数据库
关系型数据库
数据库性能优化(数据库服务端参数调优,比如调整查询缓存大小等)
应用优化
A. 引擎选择(例如Mysql的InnoDB,MyIsam,Memory等)
B. 索引优化(数据存储和索引原理,联合索引,覆盖索引,索引下推等都要了解)
高并发场景海量数据解决方案
分库分表(对于数据量特别大,而且访问量大的数据库表,可以分表分库来解决数据库写入和读取瓶颈)
批量异步写入(采用异步批量写表的方式,减少表写入频次,进而减少表的写入压力)
冷热分离(冷热数据分开存储,减少单表数据量,从而提高写入和查询性能)
读写分离(写主库,读从库,用从库分摊读流量,从库可以是一个或多个,减少了主库压力)
2.非关系数据库(NOSQL。像MongoDB等。不太重要的数据、评论评价、业务操作日志等可以用非关系数据库存储。使用过程要注意坑,篇幅原因不做详细介绍)
高并发场景解决方案
CDN (页面静态化,用CDN扛流量(扛访问量,扛带宽))
应用缓存(缓存中间件(Redis等),本地缓存(Guava cache等))
异步通信(消息队列,解耦、消峰、减少线程阻塞)
分库分表(对于数据量特别大,而且访问量大的数据库表,可以分表分库来解决数据库写入和读取瓶颈)
JVM优化(基本参数优化,选择合适的垃圾回收器)
带宽考虑(避免带宽称为瓶颈,促销和秒杀开始前提前申请带宽。不光要考虑外网带宽,还要考虑内网带宽,有些旧服务器网口是千兆网口,访问量高时很可能会打满)
秒杀场景设计
关键点:页面静态化,页面拦截请求,网关拦截请求,批量异步写数据库。详情参考作者原创
关于快速迭代
高可维护性
API封装(对组件API进行封装,如果更换组件,比如jedis换成spring-data-redis,可以直接修改API层,避免所有引用API的地方都需要变化)
高可读性(可读性高的设计和代码,可维护性也会很好)
高可复用性(可复用性高的设计和代码,可维护性也会很好)
合理的服务拆分(服务拆分合理,不同的服务由不同的组或个人维护,可维护性会大大提高)
2. 水平扩展能力
性能瓶颈(避免数据库,缓存中间件,消息队列,网络等称为系统瓶颈,保证系统水平扩展能力)
服务注册发现(在服务节点上下线过程中,自动发现服务节点,无需人工介入)
3.中台思想
共享服务(中台思想的前奏,以电商为例,将订单、商品、交易等等稳定业务抽出做成共享服务,避免一个企业内部不同团队的重复开发和重复维护工作,能够快速应对业务变化)
中台思想(大中台,小前台。以电商为例,将订单、商品、交易等等稳定业务逐渐沉淀到中台,有新增业务或者业务发生变化时,前台业务可以基于中台服务快速完成系统迭代)
关于高可用(避免单点问题,保证持续提供服务)
发布部署
灰度发布设计(为避免线上全盘错误或系统崩溃,C端功能需要灰度上线,再逐步增大流量)
流量摘除(在节点重启之前要提前摘除该节点上的访问流量,避免重启过程访问错误,进而影响用户体验)
隔离部署/分组部署(为了避免相互影响,后端运营系统和C端服务所依赖的共同服务需要隔离部署。秒杀和日常交易所依赖的订单服务和库存等服务也要隔离部署)
CI(持续集成)
CD(持续部署)
监控
运维监控(CPU,内存,网络等监控)
全链路监控(APM)(Pinpoint、Skywalking等全链路监控工具,可以监控跨系统跨服务的整个调用链路。对发现问题、排查问题和及时预警有很大帮助,还支持服务调用关系网络拓扑图)
业务监控(对业务异常进行监控,比如优惠券使用异常、刷单问题等)
容器技术
Docker(开源应用容器引擎)
Kubernetes(Google开源的一个容器编排引擎,让部署容器化的应用简单并且高效)
DEVOPS
(用工具系统的方式,将研发,测试和运维过程串联起来,减少彼此间沟通成本,降低由于沟通问题出错的几率)
QA
性能测试(对to C的互联网系统,稳定性非常重要,性能测试是必须的,除了做测试环境压测外,还可以定期做线上全链路压测)
自动化测试(快速迭代过程,很多代码可能会影响到全局,需要做回归测试,测试人员很难覆盖到所有用例。很多公司在自动化测试投入大量人力,保证上线质量的同时,还能节省人力)
CI测试(持续集成测试,每次有代码变动构建(编译)工程时自动执行一遍测试用例,保证代码的新增和改动不影响原有功能,适用于测试用例不需要经常变化的成熟稳定业务)
功能测试
CDN
页面静态化(商品详情页等静态化,存储于CDN,CDN扛流量,减少后 端服务和数据库的访问频次和压力,同时节省了网站带宽流量)
CDN回源(图片,视频,静态文件等静态资源存放在CDN,采取回源策略,CDN取不到,回源站获取后拉到CDN)
预热(提前将静态资源推到CDN预热,减少回源压力)
搜索推荐
ES,solr
安全
机器人,脚本,防刷(网关层按用户ID限流,整体限流)
风控系统(控制薅羊毛,欺诈交易等)
防火墙(防DDos等网络攻击)
高防服务(防DDos,CC网络攻击)
好啦,就分享到这里。
欢迎关注个人微信公众号:架构师进阶之路
作者简介:15年电商研发经历,曾任职于阿里巴巴,楚楚街,每日优鲜等公司,任技术总监。个人微信公众号:架构师进阶之路