背景
标题中含有Java,没办法,用Java语言开发最多,只好如此。文本适合具备【架构师】能力的人阅读,涉及知识较广,相对比较宏观,以后能抽出时间在具体弄弄,总结总结。
并发是什么?
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
自我理解的概念(通俗一点地理解):
1、并行,就是同时执行,相互不干扰;
2、并发,就是同时执行,由于要占用的资源有冲突,因此同一时刻只能有一个执行;
举例说明:
1、并行,2个队列分别在2窗口办事,无冲突。
2、并发,2个队列同时在1窗口办事,有冲突,来回切换(计算机中的线程,称为上下文切换)。
关于单核和多核CPU的说明:
1、单核CPU同时只能执行一个进程,同一个时刻,各个进程之间你争我抢,最终也只有一个能够成功执行任务,如此不断重复。
2、多核CPU同时可以执行多个进程,宏观上是并行的,微观上是串行的,这是由于OS(操作系统)的调度系统决定的,OS调度系统把运行时间分为一段段的时间片,并依次选择每个进程,最多执行时间片指定的时长。
多线程的相关知识:
1、进程,操作系统的基本执行单元,是一个操作系统正在执行的程序。
2、线程,则是属于进程上的的一个控制单元,也就是一个进程包含了多个线程。
3、锁,提到线程离不开锁,由于并发,都想赶紧执行,某一个时刻只有一个线程获得锁,成功执行。
IO的相关知识:
1、同步(Synchronous),发出一个调用(函数、方法、接口等)时,没有得到结果之前, 该调用不返回。
2、异步(Asynchronous),发出一个调用(函数、方法、接口等)时,调用在发出之后,不管结果直接返回。
3、阻塞( Blocking ),调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会继续执行,经典的Java IO。
4、非阻塞( Nonblocking),不能立刻得到结果之前,该调用不会阻塞当前线程,Java NIO。
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关,也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。
什么时候用到这些东东呢?
1、如web系统,客户端(浏览器)发出请求-->服务器端接收-->开启线程执行请求-->该线程包含请求的全部动作(ThreadLocal存储等)-->线程执行完成后响应(返回内容)客户端;
2、当有很多个客户端大批量的请求时,那么开启线程就多得多了,这时候由于线程都同时访问某些相同资源,这就有冲突了,于是需要锁,先得到锁的,先执行。
3、那么,为保证系统能够同时并行处理很多请求,称之为:高并发。
高并发以及高并发的指标
高并发(High Concurrency)通常是指通过设计保证系统能够同时并行处理很多请求。是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发常用的4个指标:
响应时间(Response Time),系统对请求做出响应的时间。例如:系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
吞吐量(Throughput),单位时间内处理的请求数量。
每秒查询率QPS(Query Per Second),每秒响应请求数。(在互联网领域,这个指标和吞吐量区分的没有这么明显)
并发用户数,同时承载正常使用系统功能的用户数量。例如:一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。
通过以上内容,总结一下:
1、大流量,一定是访问的用户实在太多了,再优秀的单体架构也架不住人多。
2、高并发,在有限的资源下,能同时承载更多的请求处理。
3、数据及数据结构,频繁访问,总免不了数据交互,数据得多少,数据得存储结构就会有很大影响性能的可能了。
至此,不难发现,这个命题挺广,可以采取得手段也非常之多,总之,离不开程序得实现方式。
高并发的解决方案
1、程序利用缓存=>【程序开发】减少访问资源次数
前置条件:读多写少
具体技术:HTTP缓存、Map缓存、EHCache、Redis等等等;
2、网络流量分流=>【程序部署】负载均衡、分布式
前置条件:大流量
具体技术:HTTP重定向、Nginx反向代理、HAProxy反向代理、Liunx下的LVS(基于IP的负载均衡)等等等;
3、数据分片(Sharding)存储=>【程序部署】读写分离,垂直分库,水平分表
前置条件:存储数据量大
具体技术:MyCat、Sharding-JDBC等;
4、减少线程阻塞=>【程序开发】选择Java NIO而不是Java IO
从现象上看,IO是阻塞的,NIO是非阻塞的,从底层看,NIO免去内核态和用户态的相互切换,所以效率更高;
具体技术:Netty、Spring Boot WebFlux等;
5、服务降级限流削峰熔断=>【程序开发】根据业务场景确定
前置条件:特殊领域
服务降级,流量高峰期时期,限制一些比较耗性能的搜索功能;
削峰限流(current limiting),瞬时流量拉长,强行把并行变成串行,排队处理,可提示等待或者排队;
超时熔断,访问资源频繁超时,采取熔断机制;
具体技术:MQ(消息队列),Spring Cloud微服务框架
总之,还有其它很多很多的方式,可以实现哦,例如:优化JVM。