高并发系统优化思路

硬件、操作系统层面的优化:

1、提升硬件性能,采用多核CPU、增加内存、固态硬盘,注意32位系统内存限制为2G,64位则无此限制,

2、为应用服务增加集群负载均衡,硬件负载F5,软负载LVS、Nginx,进行限流

3、请求数据进行动静分离,若访问静态资源如静态页面、图片可通过Nginx进行路由至固定路径获取,无需访问后台服务器,降低服务器压力

应用系统架构优化:

1、系统设计初期要考虑好拓展性,采用分布式,在CAP三者间取一个良好的平衡,选取一个分布式应用间高效的RPC通讯框架(dubbo、thrift);

2、注意系统高可用设计,防止单点故障,做好服务容错(failback/failover/failfast/failsafe)、做好访问量高峰期备案,如服务降级、服务器动态扩容、双机热备等

3、做好应用拆分,防止应用宕机导致大量功能不可使用,针对访问量不同的应用采取不同的部署策略

4、使用缓存,减少对数据库的访问,将高频使用较少变动的数据放到缓存中,可采用单机缓存或分布式缓存,技术选型ehcache或memcached、redis等。为提高缓存命中率可对用户请求根据用户ID做一致性hash,保证每次同一个用户请求发送到同一台服务器

5、多核CPU系统可以采用多线程,线程池的方式加快系统处理速度

6、分布式系统中合理利用消息中间件做好应用解耦、访问量削峰填谷(rocketmq pull模式拉取数据)、分布式事物最终一致性等

编码规范及JVM优化:

1、根据应用的特点选择合适的垃圾收集器,例如需要高吞吐量则选用Parallel Scanvenge,需要提高响应速度则采用CMS或G1收集器,根据访问量大小设置一个合理的JVM大小、垃圾清除触发点等等

2、高并发环境注意使用java类需要考虑线程安全,可以选用线程安全容器如ConcurrentHashMap,CopyOnWriteList,或者合理利用锁机制,诸如synchronized、reentrantLock、reentrantReadWriteLock等,分布式环境甚至需要使用分布式锁,可采用redis、zookeeper等实现,注意锁对中断、共享、超时的支持

3、减少锁的持有时间,多线程尽量以相同的顺序获取锁,以避免死锁情况;

4、合理使用线程池,减少线程创建、销毁开销,但不是线程越多越快,最好为CPU数+1;若为单核CPU系统但有很多IO等待场景,也可以使用多线程,提高CPU时间利用率

数据库优化:

1、采用良好的数据库架构设计,诸如读写分离,水平拆分、垂直拆分;读写分离、垂直拆分即为多数据源问题,拆分规则可以为地域、业务发生时间、业务类型等,可以通过数据访问层中间件或AOP+Annotation自己实现;水平拆分注意拆分规则,可以采用用户ID,账户ID等进行拆分,注意避免多数据库联合查询、分布式事物等,为此可以在设计表的时候进行一定的数据冗余,例如交易表存留客户一些必要信息,将公共表例如权限、路由表在每个库均复制一份

2、合理使用缓存,例如Mybatis开启一级、二级缓存,减少数据库访问,开启preparedStatement,减少运行时sql预编译开销

3、sql编写使用注意事项:①合理使用索引(单个索引、联合索引,太多会影响表插入、删除速度,jion列使用索引)②尽量减少让索引失效的语句使用例如:like ‘%’,or,sql中拼接、sql中使用计算函数等;③多表查询使用小表驱动大表;④select只返回需要的项⑤表字段设计时尽量非空等等

4、采用高可用的分布式事物解决方案,例如:2pc(对网络要求高,高并发下系统负载太大,效率不高)、柔性事物(通过rocketmq发送事物消息,达到数据最终一致性)

良好的运维:

1、做好流水表记录、日志收集工作,流水表中记录交易要素项及交易访问的服务器ID,便于查看日志;

2、建立良好的安全预警机制,若有问题及时通过email,短信方式自动提示相关负责人,以便及时跟进

3、做好灾备工作,主备切换,多地部署

新技术的使用:

1、采用微服务架构,解耦各应用,应用间互不影响,提高系统可用性,

2、docker容器技术,解决生产、测试环境不一致问题,通过容器动态部署、卸载达到服务器集群动态扩容、快速部署目的。

猜你喜欢

转载自blog.csdn.net/smartValentines/article/details/79948257