成人免费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 的時候,需要給每個線程維護一個調用棧,以及剖析結果列表?;旧峡梢詫崿F為 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

2021-03-01 23:26:41

日志Spring BootAOP

2020-06-08 19:30:21

大數據技術智能建筑

2013-07-26 17:07:33

Foglight容量

2013-01-14 12:24:06

Firefox OS

2009-06-03 10:32:36

Oracle性能優化分區技術

2009-03-23 10:04:46

Java Web入侵檢Java Web應用EasyJWeb

2009-08-25 15:35:45

citrxinetscalerncore

2013-08-16 10:14:32

APIWeb應用以API為中心的Web

2010-04-02 15:20:44

惠普成功案例

2010-08-25 09:48:14

W3CWeb性能工作組

2023-02-21 14:16:42

2025-05-16 16:24:51

云計算服務器邊緣計算

2015-08-19 09:38:29

云集群高性能計算云計算

2013-08-09 14:18:33

2016-08-23 14:37:21

2023-12-26 00:58:53

Web應用Go語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费看a| 在线观看成年人视频 | 中文字幕在线观看一区 | 黄色在线免费看 | 一区二区不卡 | 男女网站在线观看 | 欧美成人精品在线 | 日韩av一区在线观看 | 久久精品91久久久久久再现 | 国产精品www| 欧洲免费视频 | 99精品视频一区二区三区 | 欧美亚洲在线视频 | 国产亚洲一区二区三区在线观看 | 国内自拍偷拍 | 麻豆天堂 | 天天草天天射 | 曰批视频在线观看 | 韩日免费视频 | 欧美日韩高清免费 | 欧美精品一区二区免费视频 | 日本韩国欧美在线观看 | 精品福利在线 | 亚洲网视频 | 午夜久久久久久久久久一区二区 | 天天天久久久 | 91福利影院 | 亚洲国产一区二区三区 | 亚洲免费在线 | 青青久在线视频 | 天天天操天天天干 | 久草综合在线视频 | 日韩欧美国产一区二区三区 | 日本不卡免费新一二三区 | 精品麻豆剧传媒av国产九九九 | 久久久久久久久精 | 日本黄色免费视频 | 亚洲国产精品久久久久婷婷老年 | 久久精品a级毛片 | 亚洲国产精品一区二区三区 | 国产一区二区自拍 |