多線程、分布式、集群和高並發之間的區別


  作為一名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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM