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

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

多线程、分布式、集群和高并发之间有啥区别

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

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

什么是多线程

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

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

什么是分布式

  分布式是一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。它将一个完整的系统,按照业务功能拆分成一个个独立的子系统,实现业务解耦。处理请求时需要调度多台服务器,从而提高一个请求的处理速度。但是如果一个节点宕机,那么这个业务就不可访问。

  该领域需要解决的问题很多,在不同的技术层面上,又包含:分布式文件系统,分布式数据库,分布式缓存,分布式计算等等,一些名词,如:Hadoop、zookeeper、MQ等都跟分布式有关。

什么是集群

  集群就是多台服务器集中在一起,实现同一业务,处理请求时调用哪台服务器都可以。它是从原来的单机演变而来的,单台机器扛不住流量压力时就加机器进行分流,直到服务负载、稳定性、延时等指标都满足要求,集群中的N台机器上部署一样的程序(通俗地讲就是多台tomcat放相同的代码),就像一台机器被复制多份一样,这种形式就是集群化。集群有如下两个特点:

  可扩展性:集群中的服务可以动态的添加机器,从而提升集群的处理能力。

  高可用性:如果集群某个节点发生故障,这个节点上面运行的服务可以被其它服务节点接管,从而增强集群的高可用性。

什么是高并发

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

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

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

结束语

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

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

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

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

  对于Java开发而言,分布式、高并发与多线程始终是重点和难点,若想在职业道路上走得更远、更长、更快,那么就需要逐步掌握这三者,夯实基础。

  以上就是这篇文章的全部内容了,希望本文对道友的学习或者工作能带来一定的帮助,如有疑问请留言交流。Wiener在此祝各位生活愉快!工作顺利!

Reference

posted @ 2022-02-12 21:26  楼兰胡杨  阅读(342)  评论(0编辑  收藏  举报