开篇语
想写这样一个东西很久了,在慕课网上学完某老师的课程(避免打广告的嫌疑就不贴出来了,感兴趣的同学可以去慕课网上去搜来看看,是个付费课程)之后就觉得应该有这样的一个学习总结的东西来,后来因为懒又有其他事情耽误了,然后又上了新项目(正好拿来练手了,当然也只用了其中的某几项手段来用),在前前后后又读了几本书,就觉得更有必要写一些东西来总结一下。
文章脉络
这应该会是一个系列的文章,东西太多一篇总结不完,文章脉络还是会按照当时学习的思路来整理:java内存模型、线程基础回顾,JUC包,然后是辅助并发的如消息队列、缓存等高并发的组件等。
大纲思维导图
这里先给出思维导图,思维导图文件上传到了CSDN上,感兴趣的同学可以自行下载,你也可以在评论区留下你的邮箱,我会私信给你
J.U.C包思维导图
J.U.C包是一个通过JCP(Java Community Process)和JSR创建的一个支持中间并发类的集合,大致总结出来可以划分成五类,包括并发锁、安全容器类、在基础类型上封装的atomic数据类型,线程池和工具类。
分布式系统的架构
分布式架构是一个循序演进的过程
- 应用程序和数据服务以及文件服务都放在一台服务器上
- 应用程序、数据库、文件分别部署在独立的资源上
- 基于二八定律(80%的业务集中在20%的数据上),将访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力
- 添加集群:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题
- 数据库读写分离:根据读写需求的不同,设置读数据库和写数据库
- 反向代理和CDN加速:为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存
- 分布式文件系统和分布式数据库:任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑
- 使用NoSQL和搜索引擎:随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎
- 业务拆分:为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统
- 分布式服务:公共的应用模式被提取出来,部署在分布式服务器上供应用服务器调用
高并发处理手段
从分布式架构的演进得出高并发处理的常见手段如思维导图列出来的那样
- 扩容:水平扩容和垂直扩容
- 缓存:Redis、Memcache、GuavaCache等
- 队列:kafka、RabbitMQ、RocketMQ
- 应用拆分:服务化Dubbo与微服务Spring Cloud
- 限流:Guava RateLimiter、常用限流算法
- 服务降级与服务熔断:Hystrix
- 数据库切库、分库、分表等
- 其他手段:任务调度分布式elastic-job、主备curator、监控报警机制等
小结
写这些东西算是对自己过去一段时间的总结,也算是一种知识管理吧;越学到深处,就越发觉得自己掌握的还只是皮毛.....共勉