當前位置:
首頁 > 知識 > 重構大型業務型寫介面——並行處理注意點

重構大型業務型寫介面——並行處理注意點

概述

為了提高介面的處理速度,通常會使用並行的方式。在JAVA中可以使用ThreadPoolExecutor 或者ForkJoinPool 。像並行查詢或者並行調用外部介面,經常會用到這兩種技術,基本上沒什麼坑。但是如果是使用這兩種技術來重構大型的業務型寫介面,則需要小心細緻。

task切分

task粒度切分是個技術活。必須大小合適。盡量保證執行task的每個線程各自擁有自己的數據,各干各的。沒什麼共享的資源需要訪問或者更新,不然可能產生對共享資源的競爭,影響到介面的響應速度。

task裡面避免慢查詢

如果task裡面有慢查詢SQL,線程雖然獲取到了DB連接,但是影響到了線程的處理速度。尤其是並發線程比較多的情況下。

配置多一些DB連接

大型的寫介面,需要頻繁的操作DB,加上多線程並行處理,對DB的壓力也就更大。DB連接是共享資源,如果數量太少,會造成線程獲取不到DB連接,導致線程處理數據的時間拉長了。

收集數據,使用並發集合容器類

不支持並發的JAVA集合容器,在並發情況下會拋異常。如果想在各個task中統計一些數據,需要使用ConcurrentHashMap等容器。

無需保證數據一致性的,別用事務。必須使用,用短事務

事務需要DB支持,會帶來一些開銷。能不用盡量不用。如果一定要用事務,盡量使用短的事務。長事務會導致線程持有DB連接的時間太長了。導致其他線程無法獲取到DB連接。

外部系統是否支持並發調用

如果你自己應用的介面使用了並行技術,並且在介面中調用了外部介面,一定要注意外部系統的介面是否能夠支持的住並發調用。如果不行,應該要調整線程並發數或者讓對方系統加伺服器。

藉助jvisualvm工具分析線程執行時間

使用多線程並行處理的時候,一點要觀察這些線程在CPU的執行時間是否比較平均。如果部分線程在CPU里執行時間長,部分短,那麼可能是部分線程在某些地方被阻塞住了。可以利用JAVA自帶的jvisualvm來分析。

RejectedExecutionException處理

使用了ThreadPoolExecutor後,會有一個隊列存儲task。當隊列滿了後,會拋出RejectedExecutionException 異常。對於業務型介面,可以拋出一個類似」隊列已滿,請稍後再試」這樣的提示,以便讓業務人員放慢操作或者不要繼續操作,產生過多的流量。

重構大型業務型寫介面——並行處理注意點

打開今日頭條,查看更多圖片
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

帶著新人學springboot的應用04(springboot+mybatis+redis 完)
通俗易懂,C井如何安全、高效地玩轉任何種類的內存之Span

TAG:程序員小新人學習 |