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