成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

借助 AOP 為 Java Web 應用記錄性能數據

開發 后端 開發工具
作為開發者,應用的性能始終是我們最感興趣的話題之一。然而,不是所有的開發者都對自己維護的應用的性能有所了解,更別說快速定位性能瓶頸并實施解決方案了。

作為開發者,應用的性能始終是我們最感興趣的話題之一。然而,不是所有的開發者都對自己維護的應用的性能有所了解,更別說快速定位性能瓶頸并實施解決方案了。

今年北京 Velocity 的贊助商大多從事 APM 領域,提供性能剖析、可視化甚至優化的解決方案。這些廠商的產品看起來能夠很好地幫助中小企業的開發者解決應用性能上的缺陷,但是這些產品幾乎都有著一個致命的缺陷:極強的侵入性。

[[147869]]

開發者需要在業務生產代碼中嵌入 APM 廠商提供的埋點代碼,才能夠使用 APM 廠商提供的 Saas 服務。在瞬息萬變的技術大潮中,這種代碼級別的侵入和綁定,總是讓開發者憂心忡忡。如果我作為架構師,在自建 APM 還是使用 Saas APM 上,我也會謹慎考慮。

然而無論自建 APM 還是使用 Saas 服務,其底層模型無非就是海量日志的實時處理,數據來源就是應用產生的性能日志了。

If we have data, let’s look at data. If all we have are opinions, let’s go with mine.

Jim Barksdale

這是一個數據為王的時代,夸張一點說,數據可以指導一切!

言歸正傳,如果我們不希望使用 APM 嘗試提供的強侵入的服務,我們就只能自建服務了,比如以 AOP 的方式采集線程內調用樹以及調用開銷并輸出日志,然后使用 ELK(Elasticsearch, Logstash, and Kibana) 去采集日志并提供搜索、可視化等功能。如果采集的日志僅作為離線計算使用,可以直接用 Flume 把日志寫入 HDFS。

隨著系統流量越來越大,上述的方案漸漸就扛不住了,然后就需要自己實現高性能的日志采集 Agent,把采集到的日志一股腦寫入 Kafuka 之類的能扛大量堆積消息的 MQ 里面,然后使用 Storm/JStorm 做實時的流式計算。

前些日子我簡單搞了一個基于 AOP 來抓取調用樹和開銷的嘗試,感覺有點意思,分享一下。

抓取調用樹和時間開銷

在 Java 里面獲取代碼塊的時間開銷最常見的手段就是 System.currentTimeMillis()。Apache 和 Guava 等流行類庫都有對獲取時間開銷這一功能的封裝類 StopWatch。

捕獲調用樹就沒有什么常見的封裝了。一種推薦的做法,是在一次調用中,給每個要剖析的代碼塊一個唯一的標記,這個標記要能夠體現代碼塊之間的嵌套、順序等關系。

舉個栗子,我們有如下調用關系。

  1. func1 
  2. +- func2 
  3. |  +- func3 
  4. |  /- func4 
  5. /- func5 

為了體現調用之間的嵌套和順序,我們給 func1 標記 0,給 func2 標記 0.1,給 func3 標記 0.1.1,給 func4 標記 0.1.2,給 func5 標記 0.2。如此一來,我們便能夠輕易地根據標記重建出調用樹。

我們可以把調用樹的抓取和記錄每個代碼塊的時間開銷的功能以線程安全的手法封裝起來,給這個封裝起一個類似于 Profiler 的名字。Profiler 提供 2 個靜態方法,enter 在進入代碼塊之前調用,exit 在代碼塊結束之后調用。

在實現 Profiler 的時候,需要給每個線程維護一個調用棧,以及剖析結果列表。基本上可以實現為 enter 壓棧,exit 退棧并把結果放入結果列表,當調用棧退空后,輸出完整的剖析結果。

AOP 與方法攔截器

Profiler 有一個需要嚴格執行的約定,就是 enter 和 exit 必須成對調用,就像 C++ 里面 new 和 delete 必須成對出現一樣,否則內存會被直接打爆,遠不是內存泄露這么簡單。

這種約定如果寫到業務代碼中,會死的很難看,各種 try finally 硬生生的把業務邏輯打斷,本來業務代碼就已經很惡心了,這么一搞簡直沒法維護。

所以我們需要一種比較科學的方式,以無入侵的方式實現對 Profiler 的正確調用。AOP 是一種合適的工具。

這里以 Spring AOP 為例,實現一個簡單的例子。

首先引入 Spring AOP 的依賴,或者包含 org.aopalliance.intercept.MethodInterceptor 的包。

  1. <dependency> 
  2.     <groupId>org.springframework</groupId> 
  3.     <artifactId>spring-aop</artifactId> 
  4.     <version>2.5.6</version> 
  5. </dependency> 

如果需要代碼能夠運行,還需要引入 cglib 的依賴。

  1. <dependency> 
  2.     <groupId>cglib</groupId> 
  3.     <artifactId>cglib-nodep</artifactId> 
  4.     <version>2.2</version> 
  5. </dependency> 

方法攔截器的參考實現如下,使用 try finally 這樣的 code pattern 去保證 Profiler 被正確使用。

 

  1. public class Interceptor implements MethodInterceptor { 
  2.     @Override 
  3.     public Object invoke(MethodInvocation invocation) throws Throwable { 
  4.         Class clazz = invocation.getMethod().getDeclaringClass(); 
  5.         String method = invocation.getMethod().getName(); 
  6.         String mark = clazz.getCanonicalName() + "#" + method; 
  7.         Profiler.enter(mark); 
  8.         try { 
  9.             return invocation.proceed(); 
  10.         } finally { 
  11.             String log = Profiler.exit(); 
  12.             if (log != null) { 
  13.                 System.out.println(log); 
  14.             } 
  15.         } 
  16.     } 
責任編輯:王雪燕 來源: 潘家邦
相關推薦

2016-11-28 09:13:29

單頁Web模板數據

2025-02-11 09:39:00

2013-01-04 13:47:52

CompuwareAPM

2018-09-10 12:14:59

Modern數據架構IBM

2013-01-14 12:24:06

Firefox OS

2013-07-26 17:07:33

Foglight容量

2020-06-08 19:30:21

大數據技術智能建筑

2009-08-25 15:35:45

citrxinetscalerncore

2009-06-03 10:32:36

Oracle性能優化分區技術

2013-08-16 10:14:32

APIWeb應用以API為中心的Web

2009-03-23 10:04:46

Java Web入侵檢Java Web應用EasyJWeb

2021-03-01 23:26:41

日志Spring BootAOP

2010-04-02 15:20:44

惠普成功案例

2010-08-25 09:48:14

W3CWeb性能工作組

2019-10-17 10:10:23

優化Web前端

2023-02-21 14:16:42

2015-08-19 09:38:29

云集群高性能計算云計算

2025-05-16 16:24:51

云計算服務器邊緣計算

2013-08-09 14:18:33

2016-08-23 14:37:21

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 女同久久 | 亚洲一区二区三区视频 | 久久av网| 91在线观看视频 | 成人免费在线观看视频 | 国产高清精品一区 | 国产精品黄 | 日韩精品一区二区三区在线观看 | 99国产精品视频免费观看一公开 | 久久国产欧美日韩精品 | 免费黄视频网站 | 日韩成人精品一区 | 狠狠操婷婷 | 久热9| 欧美成人影院在线 | 国产精品久久 | 毛片a | 精品久久中文 | 精品一区二区三区在线观看 | 日本午夜在线视频 | 亚洲色片网站 | 少妇午夜一级艳片欧美精品 | 狠狠狠干 | 色吧综合 | 日韩在线不卡 | 日本偷偷操 | 日韩一级不卡 | 狠狠色综合久久丁香婷婷 | 亚洲欧美视频 | 亚洲视频精品在线 | 国产原创在线观看 | 在线观看成人 | 看片wwwwwwwwwww| 欧美亚洲成人网 | 国产精品乱码一区二三区小蝌蚪 | 成人av一区二区三区 | 精品国产不卡一区二区三区 | 免费黄色的视频 | 国产精品久久久久久吹潮日韩动画 | 久夜精品 | 久久久久久久久久久成人 |