大家好,我是借力好风。
前言
相信大多数刚工作的Java程序员很少使用并发编程(说的就是阿借自己),一般应用场景就是用线程池开启一个异步任务来执行。并发编程在Java语言中恰恰又是属于难点,如何理解和掌握并发编程的核心,如何学会编写正确的并发程序,突破系统在高并发场景的瓶颈等等问题,都是需要我们不断的入门学习和进阶提升自己并发编程能力的。
学习并发编程前,我们先弄明白几个问题:
- 并发到底是什么?
- 系统如何支撑高并发?
- 并发量的决定因素有哪些?
理解系统并发
今天是2021年10月29日,马上迎来”双十一“,电商又双叒叕要开始大战了!这场没有硝烟的背后,说到底,是系统并发能力的博弈!谁的服务关键时候不宕机,谁就多到账一分!阿借掐指一算,最后还是阿里获胜!
开个玩笑,毫无悬念每年都是阿里获胜😂。。。
系统的并发量,简单来说,就是系统能够同事处理的请求数量。
并发量的上限,间接反映了系统处理多个任务能力水平。
衡量并发量的指标一般有两个:
- TPS:Transactions Per Second,表示每秒处理的事务数
- QPS:Queries Per Second,表示每秒处理的查询数
那么,到底哪些因素决定了系统的并发数呢?如何提高系统并发数?
系统并发数的提高
硬件和软件,两者都是系统架构的并发性能的决定因素。其中,最根本的还是硬件,软件的本质是最大限度的利用硬件资源来完成计算和提供服务的。
硬件的组成:CPU、内存、磁盘、网卡、带宽等。
硬件基础性能的提升,主要在于花钱升级硬件,例如:
- 从单核CPU换成AMD线程撕裂者的64核(都1202年还不是AMD yes!🙋)
- 从8G内存升级到16G、32G......
- 磁盘采用SSD硬盘
- 使用千兆网卡
- 更换更大的带宽(这里说下移动的200M带宽,阿借免费用了四个月,感觉还可以,毕竟白嫖yyds😁)
硬件的配置提升,软件也就能够有更大的空间发挥。这里有典型的两个场景,I/O性能要求高且内存足够时(也称作I/O密集型),我们可以把更多的数据存入内存,减少和磁盘的交互来提升I/O的性能。当需要海量运算时(也称作CPU密集型),可以采用多线程的方式来处理,让CPU的多核心来帮助分配和处理计算任务。
当单个计算机的硬件资源达到瓶颈时,一般采用水平扩展的方式来提升性能。利用多台计算机资源组成一个分布式计算机来提供服务,形成基本的分布式服务架构。这种架构也会使得系统的复杂度增加,比如要考虑服务治理、服务监控、服务高可用等。
一个高并发应用,系统架构最核心的问题就是如何让更多用户在最短的时间内获得响应并完成最终的目标操作,一般用RT(Response-Time)作为衡量指标,RT的数值反应了整个系统的快慢,所以本质上还是和硬件资源的瓶颈有关。
在软件层面,也有一些其他的优化方案:
- 集群化部署,多节点机器分摊请求流量,降低单节点的计算瓶颈。
- 对于某些特点场景,采用多线程异步执行的方式进行优化,简单来说就是针对用户请求,服务端先返回一个正在处理的标识,用户先收到结果,然后服务端异步运行任务,当任务处理完后再返回给用户一个通知。
- 引入缓存机制,减少服务直接和数据库之间的交互和计算,提升I/O性能,让用户更快获得数据的响应结果。
- 通过CDN(内容分发网络)技术,让用户访问离自己当前网络最近的节点来获得数据内容。
总之,系统并发性能的决定因素很多,需要考虑的方向很多,但线程是最基础、最重要的机制,因为它能够利用多核CPU机制来提升程序的计算速度。
所以,利用好并发编程,可以让应用程序获得更多的能量,让应用程序在计算机上发挥更大潜力。
下一章,阿借与你一同学习线程相关知识。
微信搜索“借力好风”,关注阿借,及时充电。