java技术储备总结

Java 基础

需要掌握(理解原理)的Java基础知识:

  • Java集合类(Array,Set,Map, List等)
  • Java内存管理(内存分区,GC算法,内存调优,避免频繁的GC等)
  • Java多线程(线程并发,线程通信等,java集合类中有线程相关的集合实现)
  • Java IO(File, Socket, NIO, AIO, Netty)
  • Java序列化(和远程通信相关)
  • classloader
  • 设计模式(AOP, Proxy, Factory, Singleton, Strategy等)

Web开发方向servlet是基础

现代意义上的Web开发一般不会直接使用jsp做显示层。需要做前后端分离,前后端mvc,因此从java后端来说需要掌握:

  • Servelt
  • Filter

开发框架

  • 如Spring (核心是设计模式)

数据库

  • 操作,并发,事务,分库分表,SQL优化等

高并发,大数据的java系统,采用应用服务器,数据库服务器,分布式

高并发,大数据是一个笼统的概念,实际应用场景中药考虑是有多大的并发,读写压力有多大,磁盘IO有多大,根据具体的情况在系统架构上会有很多的不同。通用架构分层做法如下:

1
Requests --> load balancer --> Web Server Cluster --> Middlerware --> DB Cluster

根据具体的并发压力,需要有针对性的进行系统扩展。

load balancer层:

load balancer进行请求转发,根据具体的请求数量,需要考虑使用硬件或软件。通常情况下硬件load balancer性能远高于软件load balancer,软件实现中ngnix性能远高于Apache。当然硬件load balancer价格也会非常昂贵,需要专业维护。如F5, Redware.
考虑到页面数据是否可以缓存,需要增加CDN.如淘宝前端页面会直接从CDN读取,12306 80%的访问请求由CDN处理。
根据CDN的策略,带宽大小,并发量大小及业务重要程度,需要考虑多机房部署,减轻带宽和load balancer压力。

Web Server cluster

Web server可以使用开源的Tomcat, jBoss等,也可以使用商业的WebSphere, WebLogic。区别是开源需要自己创建、维护cluster状态,商业软件会极大的简化cluster创建和维护。
稳定,易于维护的Web Server应用服务器是基础,性能则有应用实现决定。
应用需要考虑的是线程并发,查询优化,缓存使用,通信代价。
应用完成后根据单台应用服务器的实际处理能力,横向和纵向扩展Web Server cluster.
横向扩展:增加Web Server数量(提升能力理论上无上限)
纵向扩展:增加硬件机器性能,优化应用性能,提升单台Server性能(提升能力有限,受限于硬件资源)

Middlerware

当涉及到分布式环境,需要使用中间件来保证集群一致性。
Session中间件 :如果业务是无状态,可以直接在load balancer按照轮询或权重策略转发。无需session处理,性能会高很多。
如果业务有状态:1)load balancer使用sticky session策略,由同一台server进行后续有状态服务,session无需处理。但如果server失败,转由其他server服务时,需要重新登录。测试需要client有重新登录机制,否则用户体验不好。2)session复制。session复制需要由session中间件进行处理,保证整个集群共享session,会带来额外性能损耗。
消息中间件 :分布式系统之间进行数据同步和唤醒,多个业务系统同步,需要使用消息中间件进行时效性保证。

1
消息监控的重要性,比如监控消息的堆积(超过1000条就要报警,查看是否应用报错了)

远程调用中间件: 远程调用保证分布式系统中高效的数据交换。
数据库中间件: 访问数据库层,如果数据库进行了分库分表操作,需要再数据库中间件中进行操作封装。
缓存中间件: 缓存数据库数据和业务计算数据。

DB Cluster

关系数据库
为保证数据库稳定性,会考虑创建主备数据库,多个主备数据构成数据库cluster,当主库出现失败时,自动进行主备切换。
有多个数据库的时候,根据读写频率进行读写分离。
数据量大的时候,进行分表操作。

高并发常用解决方案

  • 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
  • 用jprofiler等工具找出性能瓶颈,减少额外的开销。
  • 优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
  • 优化数据库结构,多做索引,提高查询效率。
  • 统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
  • 能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。

解决以上问题后,使用服务器集群来解决单台的瓶颈问题。


参考资料:

坚持原创技术分享,您的支持将鼓励我继续创作!