歡迎光臨
每天分享高質量文章

重構大型業務型寫介面 :並行處理註意點

(點選上方公眾號,可快速關註)


來源:Sam哥哥 ,

blog.csdn.net/linsongbin1/article/details/72861946

概述

為了提高介面的處理速度,通常會使用並行的方式。在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 異常。對於業務型介面,可以丟擲一個類似”佇列已滿,請稍後再試”這樣的提示,以便讓業務人員放慢操作或者不要繼續操作,產生過多的流量。

看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,看技術乾貨

贊(0)

分享創造快樂