高并发的认识
场景:双十一、商品秒杀等
高并发实现的底层和多线程技术是密不可分的,所以必须要了解多线程、多线程里的锁和异步处理等细节,可能学完这些对高并发还是一头雾水
我们还需要知道“部署实施高并发”,即在服务上部署redis,nginx,kafka,甚至是集群,用组件来应对高并发,毕竟高并发毕竟不是单纯能靠写代码来实现的。
目前实施高并发一般有两套技术体系,一套是基于spring cloud alibaba组件的,比如用nacos做服务治理,用ribbon做负载均衡,另一套姑且称为阿里系,一般是用nginx做负载均衡。这两套体系中有重复的组件,但不同的公司会根据情况使用其中一套体系来应对高并发,在学的过程中,这两套体系其实是相通的,学好一套以后另一套很快能上手。
Java高并发方面需要解决的问题以及相关组件。
1 需要解决负载均衡问题,比方说把一个业务模块部署到一台服务器,顶了天能应对每秒500个请求,此时可以把相同的模块部署到多个服务器,然后用nginx或gateway等组件把请求分散到多个服务器上,这样就能应对n*500个并发量,当然实际不大可能是500的倍数,但一定能成倍提升高并发的处理能力。当然还可以引入nginx+lvs集群框架。
2 数据库层面可以用缓存和分库分表组件,缓存的目的是为了让请求不走内存中的缓存,不走数据库,从而能减轻数据库的压力,分库组件,比如mycat,可以根据id取模10的结果,把比如千万级的大表拆分成10个子表,通过减轻数据表的样本数,来提升数据库的查询性能。
3 用kafka等消息中间件来异步处理。如果是同步处理,一个请求要等到服务器处理好再返回,中间会有空闲等待时间,如果在高并发场景,空闲等待时间积累太多一定会拖垮服务器,那么就可以在请求发送到服务器后立即终止该请求,而服务器处理好以后通过消息中间件异步返回结果,从而能有效减低等待时间。
4 系统监控问题。比如高并发集群一定包含多个服务器多个组件,如果有服务器宕机,或者出现性能问题,监控组件需要告警,以便让程序员介入,常用的监控组件有zabbix,cat或skywalking。
5 限流熔断服务降级等保护措施,这块可以用hystrix或sentinel来做。
6 当然还包含一些衍生的需求,比如分布式事务,远程调用或数据搜索等,或者是消息分发,这些功能也有对应的组件,比如seata,ES或netty组件,这方面就不一一列举了。
其实可以这样说,学习Java高并发,很大程度是学用组件,或者至少在开始阶段是这样的。