<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    常見的并發場景

    線程池

    并發最常見用于線程池,顯然使用線程池可以有效的提高吞吐量。

    最常見、比較復雜一個場景是Web容器的線程池。Web容器使用線程池同步或者異步處理HTTP請求,同時這也可以有效的復用HTTP連接,降低資源申請的開銷。通常我們認為HTTP請求時非常昂貴的,并且也是比較耗費資源和性能的,所以線程池在這里就扮演了非常重要的角色。

    線程池的章節中非常詳細的討論了線程池的原理和使用,同時也提到了,線程池的配置和參數對性能的影響是巨大的。不盡如此,受限于資源(機器的性能、網絡的帶寬等等)、依賴的服務,客戶端的響應速度等,線程池的威力也不會一直增長。達到了線程池的瓶頸后,性能和吞吐量都會大幅度降低。

    一直增加機器的性能或者增大線程的個數,并不一定能有效的提高吞吐量。高并發的情況下,機器的負載會大幅提升,這時候機器的穩定性、服務的可靠性都會下降。

    盡管如此,線程池依然是提高吞吐量的一個有效措施,配合合適的參數能夠有效的充分利用資源,提高資源的利用率。

    任務隊列

    除了線程池是比較發雜的并發場景外,任務隊列也是一個不錯的并發工具。JDK內部有大量的隊列(Queue),這些工具不僅能夠方便使用,提高生產力,也能夠進行組合適應于不同的場景。即使線程池內部,也是用了任務隊列來處理任務的積壓,平衡資源的消耗。

    安全的任務隊列能夠有效的平衡機器的復雜,抵消由于峰值和波動帶來的不穩定,有效提高服務的可靠性。同時任務隊列的處理也有助于統計和分析服務的狀況。

    任務隊列也可以在多個線程之間傳遞數據,有助于并行處理任務。例如經典的“生產者-消費者”模型就可以有效的提高多個線程的并行處理能力。在IO延時比較大的服務中尤其有效。 我最喜歡的一個案例是導數據是,一個線程負責往固定大小的任務隊列中壓入大量的數據,隊列滿了以后就暫停,另外幾個線程負責從任務隊列中獲取數據并消費。這將串行的“生產-消費”,變成了并行的“生產-消費”。實踐證明極大的節省任務處理時間。

    異步處理

    線程池也是異步處理的一種表現形式,除此之外,使用異步處理的目的也是為了提高服務的處理速度。 例如AOP的一個例子就是使用切面來記錄日志,如果說我們要遠程收集日志,顯然不希望由于收集日志而影響服務本身。這時候就將日志收集的過程進行異步處理。

    如今大量的開源組件都喜歡使用異步處理來提高IO的效率,某些不需要同步返回的操作使用異步處理后能夠有效的提高吞吐量。

    當然,異步也不總是令人滿意的,也會有相應的問題。例如引入異步設計后的復雜性,線程中斷后的處理機制,失敗后的處理策略,產生的消息比消費的還快時怎么辦,關閉程序時如何關閉異步處理邏輯等等。這都會增加系統的復雜性。

    盡管大量的服務、業務使用異步來處理,但是很顯然需要有保障機制能夠保證異步處理的邏輯正確性。如果認為異步處理的任務不是特別重要,或者說主業務不能因為附屬業務的邏輯出錯而崩潰,那么使用異步處理是正確的選擇。

    同步操作

    并發操作的同時還需要維護數據的一致性,或多或少的會涉及到同步操作。正確的使用原子操作,合理的使用獨占鎖和讀寫鎖也是一個很大的挑戰。

    線程間的協調與通信,尤其是狀態的同步都是比較困難的。我們看到線程池ThreadPoolExecutor的實現為了解決各個線程的執行狀態,引入的很多的同步操作。線程越來越多的情況下,同步的成本會越來越高,同時也有可能引入死鎖的情況。

    盡管如此,單個JVM內部的多線程同步還是比較容易控制的。JDK內部也提供了大量的工具來方便完成數據的同步。例如Lock/Condition/CountDownLatch/CyclicBarrier/Semaphore/Exchanger等等。

    分布式鎖

    分布式的并發問題更難以處理,根據CAP的原理,基本上沒有一個至善至美的方案。 分布式資源協調使用分布式鎖是一個不錯的選擇。Google的分布式鎖(建立在BigTable之上),Zookeeper的分布式鎖,甚至簡單的利用memcache的add操作或者redis的setnx操作建立偽分布式鎖也可以解決類似的問題。



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2011-12-29 16:31 imxylz 閱讀(8140) 評論(0)  編輯  收藏 所屬分類: Java Concurrency

    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 国产产在线精品亚洲AAVV| 久久久久亚洲AV片无码下载蜜桃| 中文字幕在线观看亚洲日韩| 四虎在线最新永久免费| 久久久久久亚洲Av无码精品专口 | 91成人免费观看在线观看| 亚洲精品无码日韩国产不卡?V| 国内成人精品亚洲日本语音 | 中文字幕亚洲激情| 久久er国产精品免费观看8| 亚洲精品无码专区久久久| 久久美女网站免费| 久久亚洲AV成人无码国产| 久草免费在线观看视频| 亚洲欧洲国产综合AV无码久久| 免费无码一区二区三区蜜桃大| 羞羞漫画在线成人漫画阅读免费| 免费看男女下面日出水视频| 一级毛片免费在线观看网站| 国产A在亚洲线播放| 我们的2018在线观看免费高清| 国内精品久久久久影院亚洲 | 精品国产免费观看久久久 | 国产成人亚洲毛片| 中文字幕在线亚洲精品| 久久久久免费看成人影片| 久久精品国产亚洲av麻豆蜜芽| 国产hs免费高清在线观看| eeuss在线兵区免费观看| 亚洲成人中文字幕| 成人免费午间影院在线观看| 一级黄色毛片免费看| 亚洲日韩图片专区第1页| 日韩高清免费观看| a级毛片免费全部播放| 亚洲av无码一区二区三区天堂古代| 国产资源免费观看| 久久伊人免费视频| 亚洲av无码成人影院一区| 国产精品亚洲A∨天堂不卡| 无码专区永久免费AV网站|