转|分布式、高并发和多线程之间的区别


作为一名java资深专家必须要清晰的明白什么叫分布式、高并发与多线程,并且要熟练的根据业务场景去运用。而这也是一个迈向高手的分水岭,是你面试时要高薪的底气之所在。

分布式,高并发,多线程之间有啥区别

这三个词估计是现如今博客区或招聘网站上最常看到的字样了,我想大部分不接触大型互联网企业的程序员都很难接触这些东西。心向往之,但无奈没机会接触。平时多线程遇到到的还算多。分布式和高并发在企业信息管理系统或者营销管理平台中可能不多见。当面试官问起这三个词的时候,是不是很多人都认为分布式=高并发=多线程? 一开始接触的时候可能很多都会混淆,所以总结一下。

并发与多线程之间的关系就是目的与手段之间的关系。并发(Concurrent)的反面是串行。串行好比多个车辆行驶在一股车道上,它们只能“鱼贯而行”。而并发好比多个车辆行驶在多股车道上,它们可以“并驾齐驱”。并发的极致就是并行(Parallel)。多线程就是将原本可能是串行的计算“改为”并发(并行)的一种手段、途径或者模型。因此,有时我们也称多线程编程为并发编程。当然,目的与手段之间常常是一对多的关系。并发编程还有其他的实现途径,例如函数式(Functional programming)编程。多线程编程往往是其他并发编程模型的基础,所以多线程编程的重要性不言而喻。

1. 什么是分布式?

分布式是一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。该领域需要解决的问题很多,在不同的技术层面上,又包含:分布式文件系统,分布式数据库,分布式缓存,分布式计算等等,一些名词,如:Hadoop, zookeeper,MQ等都跟分布式有关。

从理念上讲,分布式的实现有两种方式:①水平扩展,当一台机器的容量抗不住的时候,需要增加机器,将流量分发到所有服务器上,所有机器都可以提供相当的服务。②垂直扩展,前端有多种需求查询时,一台机器扛不住,可以将不同的需求分发到不同的机器上,比如A机器处理余票查询的时候,B机器可以处理支付请求等。

2. 什么是高并发

相对于分布式来讲,高并发(High Concurrency)在解决的问题上会集中一些,其反应的是同时有多少流量进来。比如:12306抢票、在线直播、秒杀和双十一活动等,同时有上万人观看,参抢。

该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。

高并发可以用分布式来解决,将并发的流量分到不同的物理服务器上。但除此之外,还有很多其它的优化手段,比如:使用缓存,将所有的静态内容放到CDN等。 还可以使用多线程技术将一台服务的服务能力最大化。高并发常用的一些指标有响应时间、吞吐量、每秒查询率QPS和并发用户数等。

3. 什么是多线程

多线程是指从软件或硬件上实现多个线程并发执行的技术。它更多的是解决CPU调度多个进程的问题,从而让这些进程看上去是同时执行。这几个概念中,多线程解决的问题是很明确的,手段也是比较单一的,基本上遇到的最大问题就是线程安全。在JAVA语言中,需要对JVM内存模型和指令重排序等深入了解,才能写出一份高质量的多线程代码。

多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。

结束语

实际上,分布式、高并发和多线程三者总是相伴而生,但侧重点又有不同。分布式是从物理资源的角度去将不同的机器组成一个整体对外提供服务的,技术范围非常广且难度非常大,有了这个基础,高并发,高吞吐等系统很容易实现。

多线程则聚焦于如何使用编程语言将CPU调度能力最大化。

高并发是从以业务角度去描述系统的能力,实现高并发的手段可以采用分布式。那么,怎样提高系统的高并发能力?

1、静态资源结合CDN来解决图片文件等访问。
2、分布式缓存:redis、memcached等。
3、消息队列中间件:Rabbit MQ和Apache Kafka等,解决大量消息的异步处理能力。
4、应用拆分:一个工程被拆分为多个工程部署,利用dubbo解决多工程之间的通信。
5、数据库垂直拆分和水平拆分(分库分表)等。
6、数据库读写分离,解决大数据的查询问题。
7、利用nosql ,例如mongoDB配合mysql组合使用。
8、建立大数据访问情况下的服务降级以及限流机制等。

Reference

  • https://blog.csdn.net/azitl/article/details/90233773
  • https://www.zhihu.com/question/41737405/answer/100743322