高并发思想
高并发思想
FANSEA高并发思想
什么是高并发
1.1 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
1.2 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
1.2.1 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
1.2.2 吞吐量:单位时间内处理的请求数量。
1.2.3 QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
1.2.4 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。
高并发解决思路
1,服务器网络带宽不够(增加网络带宽)
2,web线程连接数不够(DNS域名解析分发多台服务器,负载均衡,前置代理服务器nginx、apache等等)
3,数据库连接查询瓶颈(数据库查询优化,读写分离,分表等等)
4,尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能;用jprofiler等工具找出性能瓶颈,减少额外的开销。
5,优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。
6,优化数据库结构,多做索引,提高查询效率。
7,统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
8,不要频繁的new对象,对于在整个应用中只需要存在一个实例的类推荐使用单例模式;对于String的连接操作,使用StringBuffer或者StringBuilder;对于utility类型的类通过静态方法来访问。
9,避免使用错误/异常的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要;不要使用 instanceof做条件判断,尽量使用比的条件判断方式;使用JAVA中效率高的类,比如ArrayList比Vector性能好。
10,出现超时的情况,一般说明并发数量已经超过了数据库所能处理的极限,数据库无限等待导致超时,此时,建议采用线程池的方案,支付宝的单号就是用的线程池的方案进行的。数据库 update 不是一次加1,而是一次加几百甚至上千,然后取到的这 1000个序号,放在线程池里慢慢分配即可,能应付任意大的并发,同时保证数据库没任何压力。