在使用Spring Boot
開發(fā)過程中,并發(fā)concurrency
問題不可避免。很多開發(fā)者存在這樣的誤區(qū),使用Servlets
為每個請求分配一個新的線程進行處理就不再需要并發(fā)處理了。我將在這篇文章中介紹如何在Spring Boot
中處理并發(fā)并且如何避免一些問題。
有以下幾點特別值得注意:
最大線程數(shù):這是為處理應(yīng)用程序的請求而分配的最大線程數(shù)。
共享資源:調(diào)用共享資源如數(shù)據(jù)庫
異步方法調(diào)用:這些方法調(diào)用將會釋放線程資源
內(nèi)部共享資源:內(nèi)部資源調(diào)用如緩存、共享應(yīng)用程序狀態(tài)
接下來我們逐一介紹如何處理這些場景
首先我們必須限制應(yīng)用程序的線程數(shù)量。如果使用默認內(nèi)嵌的Tomcat Server
,我們可以通過server.tomcat.max-threads
變量修改線程數(shù)量限制。默認為200
。我們可以通過修改此配置以更合理利用硬件資源。
調(diào)用數(shù)據(jù)庫或者第三方Restful
接口可能需要很長時間。
我們可能遇到一個請求會調(diào)用多個服務(wù)。比如一次請求調(diào)用Service A、B、C
,你肯定不想這樣調(diào)用:
Call service A -> Waiting response from Service A -> call service B -> Watiting ... -> Compose response from A B C
每個服務(wù)調(diào)用花費三秒,整個請求處理過程將會花費9秒。如果通過下面的做法肯定會更好。
Call service A Call serviec B -> Waiting response from Service A B C -> compose reponse from A B C Call serviec C
這樣,顯然我們只需要3秒響應(yīng)。 異步和響應(yīng)式微服務(wù)十分有趣,可以參考其他文章。這里我們只關(guān)注Spring boot
。
在Spring Boot
中使用注解@EnabelAsync
注解開啟異步支持。使用@Async
將返回CompletableFuture<>
。這些異步方法將會在后臺線程中執(zhí)行。如果合理使用異步執(zhí)行,可以避免等待時間。
以上我們討論了我們無法控制的外部資源,對于系統(tǒng)內(nèi)部資源我們應(yīng)該避免共享他們。Spring Service and Controller
都是單例模式,我們需要十分小心,當狀態(tài)改變時,你需要立刻處理。共享狀態(tài)的其他潛在來源是高速緩存和自定義服務(wù)器范圍的組件(通常是監(jiān)視,安全性等)。如果你必須使用共享狀態(tài)資源,下面是我的建議:
處理不可變對象。如果對象是不可變的,則可以避免許多與并發(fā)相關(guān)的問題。如果你需要改變一些東西 - 只需創(chuàng)建一個新對象。
并非所有集合都是線程安全的。一個常見的陷阱是使用HashMap,假設(shè)它是線程安全的(它不是。如果你需要并發(fā)訪問,請使用ConcurrentHashMap,HashTable或其他線程安全的解決方案。)。
不要假設(shè)第三方庫是線程安全的。大多數(shù)代碼都沒有,并且必須控制對共享狀態(tài)的訪問。
如果你要依賴它 - 學(xué)習(xí)正確的并發(fā)性。我真的建議在實踐中獲得Java Concurrency的副本。寫于2006年,但在2018年仍然非常相關(guān)。
Spring中的并發(fā)和多線程是重要的主題。在本文中,我想強調(diào)在編寫Spring Boot應(yīng)用程序時需要注意的關(guān)鍵領(lǐng)域。如果您想在構(gòu)建高要求,高質(zhì)量的服務(wù)時取得成功,您需要圍繞這一主題做出有意識的決策和權(quán)衡。我希望通過這篇文章你知道如何開始
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/127924.html
摘要:來源是最流行的用于開發(fā)微服務(wù)的框架。以下依次列出了最佳實踐,排名不分先后。這非常有助于避免可怕的地獄。推薦使用構(gòu)造函數(shù)注入這一條實踐來自的項目負責(zé)人。保持業(yè)務(wù)邏輯免受代碼侵入的一種方法是使用構(gòu)造函數(shù)注入。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/R3InYSAIZkHQ40ly9Oztiart2lESCyjCH0JwFRp3oErlYobhibM...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補缺最易錯過的技術(shù)要點大掃盲意外宕機不難解決,但你真的懂數(shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實現(xiàn)故障恢復(fù)自動化詳解哨兵技術(shù)查漏補缺最易錯過的技術(shù)要點大掃盲意外宕機不難解決,但你真的懂數(shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:原文鏈接編程方法論響應(yīng)式與代碼設(shè)計實戰(zhàn)序,來自于微信公眾號次靈均閣正文內(nèi)容在一月的架構(gòu)和設(shè)計趨勢報告中,響應(yīng)式編程和函數(shù)式仍舊編列在第一季度的早期采納者中。 原文鏈接:《Java編程方法論:響應(yīng)式RxJava與代碼設(shè)計實戰(zhàn)》序,來自于微信公眾號:次靈均閣 正文內(nèi)容 在《2019 一月的InfoQ 架構(gòu)和設(shè)計趨勢報告》1中,響應(yīng)式編程(Reactive Programming)和函數(shù)式...
閱讀 1560·2025-02-07 13:29
閱讀 1002·2024-11-07 18:25
閱讀 131495·2024-02-01 10:43
閱讀 1323·2024-01-31 14:58
閱讀 1144·2024-01-31 14:54
閱讀 83571·2024-01-29 17:11
閱讀 3869·2024-01-25 14:55
閱讀 2390·2023-06-02 13:36