精彩技巧(1) 非同步列印日誌的一點事

2022-07-18 00:15:14 字數 895 閱讀 7295

最近剛剛結束轉崗以來的第一次雙11壓測,收穫頗多,難言言表, 本文就先談談非同步日誌吧,在高併發高流量響應延遲要求比較小的系統中同步打日誌已經滿足不了需求了,同步打日誌會阻塞呼叫打日誌的執行緒,而打日誌本身是需要寫磁碟的,所以會造成rt增加。非同步日誌就是為了解決這個問題。

如上圖,多個業務執行緒列印日誌時候要等把內容寫入磁碟後才會返回,所以打日誌的rt就是寫入磁碟的耗時。

如上圖多個業務執行緒列印日誌時候是把列印任務放入記憶體佇列後就直接返回了,而具體列印日誌是有日誌系統的乙個日誌執行緒去佇列裡面獲取然後執行,可見這種列印rt就是寫入記憶體佇列的耗時。

discardingthreshold是乙個閾值,通過下面**看他的作用:

當佇列的剩餘容量小於這個閾值並且當前日誌level trace, debug or info ,則丟棄這些日誌。

在壓測時候**配置如上,也就是配置了非同步日誌,但是還是出現了執行緒阻塞在打日誌的地方了,經檢視是阻塞到了日誌佇列arrayblockingqueue的put方法:

可知put方法在佇列滿時候會掛起當前執行緒。那麼如何解那?

上面介紹了discardingthreshold,可知本文設定為0說明永遠不會丟棄日誌level trace, debug or info的日誌,只要discardingthreshold>0則當佇列快滿時候level trace, debug or info的日誌就會丟棄掉,這個貌似可以解決問題。但是如果列印的是warn級別的日誌那?還是會在put的時候阻塞。

通過看**發現最終寫日誌時候有個判斷:

如果設定了neverblock=true則寫日誌佇列時候會呼叫arrayblockingqueue對的offer方法而不是put,而offer是非阻塞的:

在高併發低延遲要求的系統裡面不重要的日誌可以設定為非同步並且要注意設定佇列滿則丟棄策略,防止業務執行緒被掛起從而影響rt。

一點鬱悶的事

不知不覺已經從踏出校園步入工作崗位快一年的時間了,回想著這幾個月來的工作經驗不禁讓人寒心,我掰著手指想也想不出來自從自己做在這個工作崗位後做了什麼工作,幾乎每天除了自己學自己看之外沒做過幾個關於工作方面的事情,不經意將讓我看到一篇文章說 如果你剛踏入工作崗位而你的主管並沒有讓你參加專案這真是乙個悲劇...

mybatis的一點事

select insert update delete if where foreach sql等等。其中,除了查詢語句,其他的增刪改語句都可以用update標籤來用 佔位符 底層就是jdbc中的preparedstatement 的 問號佔位符,適合給表字段的值進行佔位 佔位符 適合對sql片段進...

apache php mysql安裝的一點事兒

1.mysql在linux下的my.cnf檔案在 用rpm包安裝的mysql是不會安裝 etc my.cnf檔案的,至於為什麼沒有這個檔案而mysql卻也能正常啟動和作用,在點有兩個說法,第一種說法,my.cnf只是mysql啟動時的乙個引數檔案,可以沒有它,這時mysql會用內建的預設引數啟動,第...