日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

關于Java程序服務預熱那些事

來源: 責編: 時間:2024-03-18 09:38:20 163觀看
導讀一、背景1.1 什么是服務預熱所謂服務預熱,就是在服務啟動完成到對外提供服務之前,針對特定場景提供一些初始化準備操作。比如線程池預熱、緩存預熱、數據庫預熱、web預熱和JVM預熱等。1.2 為什么要預熱因為服務剛啟動的

一、背景

1.1 什么是服務預熱

所謂服務預熱,就是在服務啟動完成到對外提供服務之前,針對特定場景提供一些初始化準備操作。56A28資訊網——每日最新資訊28at.com

比如線程池預熱、緩存預熱、數據庫預熱、web預熱和JVM預熱等。56A28資訊網——每日最新資訊28at.com

1.2 為什么要預熱

因為服務剛啟動的時候需要一段磨合期,這段期間,服務運行狀態沒有達到最佳。因此,如果這時候一下子將服務流量提升到正常水平,就有可能導致大量請求超時或者瞬間將系統壓垮。56A28資訊網——每日最新資訊28at.com

針對 Web 應用的場景,將Java程序啟動分為兩個過程:56A28資訊網——每日最新資訊28at.com

1、啟動過程:是指從JVM 啟動到程序初始化完成能響應第一個請求的階段。由于啟動時需要動態類加載和程序啟動時的初始化,導致啟動會比較慢。啟動慢會影響程序的響應度,減慢 Web 應用擴容。56A28資訊網——每日最新資訊28at.com

2、預熱過程:是指從JVM 啟動到程序優化完成、達到性能峰值的階段。預熱慢會導致 Web 應用無法及時的處理完用戶請求,造成大量請求超時。56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

二、如何預熱

2.1 預熱緩存

a.連接池預熱

和數據庫連接池一樣,我們可以在應用啟動時,根據需要初始化若干連接放入連接池,從而避免請求過來的時候再創建而影響性能。56A28資訊網——每日最新資訊28at.com

系統啟動時,嘗試獲取若干連接(這里取最小閑置),此時連接池為空,生成連接后會放入連接池,等請求進來的時候就不會再去創建連接了。56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

b.熱點數據預熱

  • 數據存到redis中

處理方案:56A28資訊網——每日最新資訊28at.com

1、配置一個定時任務,刷新緩存數據。56A28資訊網——每日最新資訊28at.com

2、直接寫個緩存刷新頁面,上線后手動刷新。56A28資訊網——每日最新資訊28at.com

  • 數據存到本地

對于一些訪問度特別高的熱點數據,在極端情況下,考慮到服務到redis有網絡延遲以及序列化和反序列化消耗,所以放入redis緩存是不太理想的。56A28資訊網——每日最新資訊28at.com

那么對于這些數據我們可以考慮放入本地緩存,當然這些數據量不能太大。對于極端的熱點數據放入本地緩存后,請求獲取數據在應用維度基本沒有任何消耗,沒有網絡延遲也沒有序列化和反序列化消耗。56A28資訊網——每日最新資訊28at.com

可以使用guava 的cache56A28資訊網——每日最新資訊28at.com

2.2 預熱線程池

1)請求接收線程池

以tomcat為例,我們可以配置初始化創建線程的數量來做線程池預熱。56A28資訊網——每日最新資訊28at.com

圖片56A28資訊網——每日最新資訊28at.com

2)自定義線程池

對于自定義線程池,初始化時候調用prestartAllCoreThreads方法即可。56A28資訊網——每日最新資訊28at.com

圖片56A28資訊網——每日最新資訊28at.com

3)預熱DB連接池

服務啟動時根據需要創建若干數據庫連接,放到連接池中,然后應用啟動處理數據庫讀寫請求時,可以直接從連接池中拿連接來用,避免了讀寫請求創建連接并放入連接池的流程耗時。56A28資訊網——每日最新資訊28at.com

我們常用的連接池Druid提供了比較方便的連接池預熱能力。常見的配置方式:56A28資訊網——每日最新資訊28at.com

圖片56A28資訊網——每日最新資訊28at.com

4)JVM預熱

大家都知道,Java語言是解釋執行和編譯執行共同存在的。即Java源代碼文件(.java)首先由Javac編譯為字節碼(.class),然后字節碼由各操作系統對應的虛擬機解釋或編譯執行。56A28資訊網——每日最新資訊28at.com

為了提高執行速度,引入了JIT(Just-in-time compilation)。在運行時,JIT會把編譯過來的機器碼保存起來,以便下次使用。JIT只會對經常執行的熱點代碼進行編譯,如循環,高頻度使用的方法等。56A28資訊網——每日最新資訊28at.com

JVM默認開啟JIT編譯,可以檢查啟動參數-Xint和-Djava.compiler=NONE,如果有說明關閉了JIT,根據需要可以移除重新開啟JIT。56A28資訊網——每日最新資訊28at.com

此外,JDK1.8引入了Lambda表達式,給開發人員帶來了很多方便,但是過度的使用Lambda表達式也會帶來負面效果。lambda表達式的原理是在執行時生成匿名內部類,并且需要加載和編譯。56A28資訊網——每日最新資訊28at.com

所以對于一些熱點代碼可以選擇不使用Lambda表達式,或者在服務啟動時進行預調用,經過充分的調用之后使其成為熱點代碼,后續的調用就會走JIT編譯,就會跳過生成匿名內部類、加載的步驟,也就提升了執行效率。56A28資訊網——每日最新資訊28at.com

三、預熱的問題及解決

3.1 時長

既然在服務啟動階段加入了預熱邏輯,就會產生損耗,最直接的體現就是服務啟動時間變長,可能幾分鐘到十幾分鐘不等。56A28資訊網——每日最新資訊28at.com

但啟動慢不一定就是壞事,相當于是在對外提供服務之前做了充足的初始化以及預熱準備。56A28資訊網——每日最新資訊28at.com

當然事情都有兩面性,關鍵的是要在啟動快與慢之間找到一個平衡點,在保證服務能夠在可接受的時間內啟動,并且上線之后短時間內就能提供高質量的服務。56A28資訊網——每日最新資訊28at.com

3.2 CPU升高

在實際應用過程中,遇到了CPU突增的情況。如下圖,服務在啟動時會收到CPU報警,查看監控發現CPU使用率是平時的2倍以上。56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

查看啟動時的預熱代碼,發現會觸發下面的請求,如圖,請求量是平時正常水平的幾百倍。因此定位應該是預熱代碼的問題。56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

預熱代碼如下:56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

圖片圖片56A28資訊網——每日最新資訊28at.com

上述代碼使用CountDownLatch作為計數器,在服務啟動時,觸發三個熱點接口,以達到預熱的目的。但是由于參數過多導致服務的請求激增,引發報警。56A28資訊網——每日最新資訊28at.com

問題定位之后,我們降低了入參數量,減少了循環次數,從而減少了服務自請求次數,問題得以修復。56A28資訊網——每日最新資訊28at.com

四、總結

以上是服務預熱的一些常見方式,服務預熱是把雙刃劍,在使用之前,需要搞清楚哪些服務需要預熱。對于需要預熱的服務,需要搞清楚具體需要預熱哪些內容,不能盲目預熱,容易適得其反。56A28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-76493-0.html關于Java程序服務預熱那些事

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我應該使用按鈕還是鏈接

下一篇: RabbitMQ代碼篇之過期時間,死信隊列,延遲隊列,優先級隊列的基本使用

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 韶山市| 旌德县| 宿迁市| 罗平县| 柏乡县| 哈巴河县| 嘉善县| 即墨市| 陇西县| 秭归县| 铜山县| 嘉兴市| 都江堰市| 余庆县| 高雄市| 津市市| 姚安县| 剑河县| 金塔县| 周口市| 遂宁市| 河池市| 库尔勒市| 久治县| 东丽区| 吉安县| 保靖县| 锦屏县| 和龙市| 皮山县| 那曲县| 西盟| 安阳县| 贵定县| 平山县| 星子县| 皮山县| 普兰县| 江门市| 鲁甸县| 厦门市|