【Takin 應用日記】記一次 TransmittableThreadLocal 引起的業務異常
對於常見的WEB容器,Takin透過增強org.apache.catalina.core.StandardHostValve#invoke方法,攔截並解析方法入參的Request物件中的header資料,判斷壓測標的資訊並將壓測標以及鏈路資訊設定到上下文物件,並透過ThreadLocal儲存該上下文物件,以此來保證當前執行緒處理的過程中都能獲取到壓測標以及鏈路資訊。
但是不管是WEB容器還是業務程式碼經常會使用執行緒池執行程式碼,這時候ThreadLocal就有侷限性了,如何做到跨執行緒池傳遞我們的上下文物件就顯得異常重要了,好在Alibaba的 解決了這個問題,具體transmittable-thread-local的詳細內容大家可以透過git地址檢視,這裡我們主要以git上的demo看看transmittable-thread-local如何實現跨執行緒傳遞的,主要透過將執行緒池執行的Runnable物件包裝成TtlRunnable物件並儲存當前的上下文資訊。這樣就完成了對執行緒池執行任務的壓測標以及鏈路資料資訊的透傳,至此似乎一切都很完美。
直到某次出現了一個詭異的現象,在使用Takin的過程中,有一應用接入Takin之後,某個功能無法正常使用,但是無論是應用的日誌還是Takin的日誌都未顯示任何異常資訊,再追問了無法使用的功能是一個執行緒池執行任務,當時擴充套件了ThreadPoolExecutor的beforeExecute方法和afterExecute方法,用以記錄任務執行的耗時,並且會列印任務的taskId等資訊,透過截圖的Debug資訊便可以看到問題出現了,由於使用了transmittable-thread-local導致原始的Runnable被包裝成了TtlRunnable物件,在這個過程中如果業務想要再獲取Runnable物件強轉獲取一些任務資訊,就會出現類無法轉換的異常。
解決方案的話目前可以透過增強beforeExecute和afterExecute方法,對Runnable物件進行判斷,如果是TtlRunnable物件,則透過TtlRunnable.getRunnable()方法返回原是的Runnable物件
Takin開源詳情
立即掃碼,入群技術交流~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004063/viewspace-2786768/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 記錄一次事務異常
- 記錄一次Flink作業異常的排查過程
- Flutter | 記一次Mixin Analysis異常Flutter
- 一次django記憶體異常排查Django記憶體
- 記錄一次Springboot Data Jdbc的autoWorkController異常Spring BootJDBCController
- 記一次訂單號重複的異常
- 記一次FreeBSD系統中mysql服務異常的排查過程MySql
- 異常篇——異常記錄
- 踩坑記:gRPC 異常響應RPC
- 線上ES叢集引數配置引起的業務異常案例分析
- 記一次棧溢位異常問題的排查
- 記一次 Redis 的事務引起的訊息佇列報錯Redis佇列
- Layui引起的對前端的一次記錄UI前端
- 一次排查線上介面偶發異常耗時引起的思考!
- 記一次伺服器被用來挖礦的異常問題處理伺服器
- 記一次線上SpringCloud-Feign請求服務超時異常排查SpringGCCloud
- Java 筆記《異常》Java筆記
- 記一次go中map併發引起的事故Go
- Java核心技術筆記 異常、斷言和日誌Java筆記
- spring cloud 微服務異常記錄與報警SpringCloud微服務
- 記錄一次因subprocess PIPE 引起的線上故障
- CoreDNS解析異常記錄DNS
- 記Linux使用異常2Linux
- 記一次kubernetes叢集異常: kubelet連線apiserver超時APIServer
- 記一次尷尬的Java應用記憶體洩露排查Java記憶體洩露
- 記一次 Java 應用記憶體洩漏的定位過程Java記憶體
- 記一次JSF非同步呼叫引起的介面可用率降低JS非同步
- Day One for Mac免費的日記應用Mac
- java異常處理筆記Java筆記
- 記錄Javascript 異常捕獲JavaScript
- java學習筆記(異常)Java筆記
- 用Fundebug外掛記錄網路請求異常
- 在日誌中記錄Java異常資訊的正確姿勢Java
- 一次線上JVM記憶體異常排查 -- 物件之間的複製JVM記憶體物件
- OneAPM大講堂 | Java 異常日誌記錄最佳實踐Java
- 記一次 .NET 某教育系統API 異常崩潰分析API
- python應用:異常處理Python
- 論一個優秀的工程師應該如何做好異常處理和日誌記錄工程師