成功與自信--TianJin

          上善若水。水善利萬物而不爭,處眾人之所惡,故幾于道。居善地,心善淵,與善仁,言善信,政善治,事善能,動善時。 Where there is a will,there is a way.

          使用AOP實現性能管理[譯]


          From:http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=AOPforAPM

          介紹

                應用開發人員使用一些傳統的技術去監控性能管理。使用像PotimizeIt,JProbe 等通用的調試工具。另一個傳統的方法是在代碼的特殊地方插入時間和有用的信息。商業的性能管理工具同樣使用不同的技術,例如 在類裝載時的字節碼探測,或者使用應用服務器的攔截器去修飾類。在此文中,我們介紹 一種 使用 Aspect Oriented Programming (AOP)的靈活多變的機制來處理應用程序性能管理。

          注意:我們使用AspectJ[1] AOP庫去闡述這種方法,此技術可適用于任意的AOP程序。

          方法
                在插圖1中,使用AOP技術“編織”的性能監視代碼自動插入到已存在的應用程序中。為了更容易些,我們把性能監控邏輯(例如:計時器,統計計算等)劃分成簡單的庫。傳統方法是手動編碼將程序庫放到應用程序中,這種方法單調乏味并且易錯。另一個好方法就是使用AOP特性,在應用程序中聲明性能監視庫需要創建的不同點,AOP工具 允許修改字節碼并自動插入到這些調用中。

          Figure 1: High-level Architecture

          文章的下列部分假設讀者基本熟悉AOP概念[2,3],例如  pointcuts 和 advice。

          實現
                我先從MonitoringFacade 類開始,它能計算一個API的執行時間。
          public class MonitoringFacade {
              
          public static long begin(Class clazz,
                  String method, String layer) { 
          /* .. */ }

              
          public static end(long startTime,
                  Class clazz, String method, String layer) { 
          /* .. */ }
          }

                我們需要 在應用程序執行有意義地方的前或者后調用MonitoringFacade的一對begin/end方法。MonitoringFacade 類是一個普通的Java類,它來計算時間和使用統計,像min,max,average,first和last執行時間,這些是創建調用樹(call trees)所需要的,把這些測量數據與那些收集上來的系統中的其他部分聯系起來。我們寫一個 abstract aspect ,它來調用MonitoringFacade。
          public abstract aspect InfraREDBaseAspect {
              
          /**
               * The condition based on which monitoring is performed.
               
          */
              
          public abstract pointcut operationToBeMonitored();

              
          /**
               * Gets the layer (Web, Hibernate, JDBC etc.) of the operation
               
          */
              
          public abstract String getLayerName();

              
          /**
               * Calls the agent fa?ade before and after the execution of the
               * monitored operation
               
          */
              Object around() : operationToBeMonitored () {
                  
          final Class clazz =
                      thisJoinPointStaticPart.getSignature().getDeclaringType();
                  
          final String method =
                      thisJoinPointStaticPart.getSignature().getName();
                  
          final String layer = getLayerName();
                  
          long startTime = MonitoringFacade.begin(clazz, method, layer);
                  
          try {
                      
          return proceed();
                  } 
          finally {
                      MonitoringFacade.end(startTime, clazz, method, layer);
                  }
              }
          }

                抽象aspect 的具體實現 為被監控的特殊操作提供了切入點,例如session bean調用,Struts 執行,entity bean調用,Hibernate 查詢等。他們同樣提供一個layer name(例如:“Struts”,“Hibernate”等等),它關系到被收集的統計數據。這讓我們提供感興趣的統計,例如某層執行花費的全部時間,這些有利于性能和伸縮性分析。

                 我們已經編寫一個具體的aspect,我們需要將它們“編織”到應用程序類中。“編織”是一個修改應用程序類字節碼并插入Facade調用的過程。AspectJ 提供工具去做此事。
                 下面是一個具體的HibernateAspect類,它在"Hibernate Query" 范圍內,定位和記錄所有Hibernate的查詢時間。

          public aspect HibernateAspect {

              
          public pointcut hib3Query :
                  execution(
          public java.util.List org.hibernate.Query+.list());

              
          public pointcut hib3Find :
                  execution(
          public * org.hibernate.Session+.find());

              
          public pointcut operationToBeMonitored() : hib3Query || hib3Find;

             
          /**
              * Gets the layer name of the operation
              
          */
              
          public String getLayerName() {
                  
          return "Hibernate Query";
              }
          }

                  同樣的,你能在普通的地方寫不同的appect去捕獲信息,例如:struts 執行時,JDBC 語句執行等等。如果需要的話,可以暴露pointcut定義,讓用戶很容易定制期望被監視的部分應用程序。

          優點

          與其他方法相比,考慮更多高級的定制和更強的靈活性可以使用AOP工具的強大功能。下面列舉一些優點:

          ·選擇性的監控部分的應用程序而不是使用包名和API名去限制。pointcut定義語言有杠桿作用的功能,例如:監控APIs僅僅在當前執行上下文(使用AspectJ特性,像cflow),基于參數和它們的類型監視APIs,等等。
          ·在一個高層粒度去捕獲統計的功能。舉例:很容易收集在servlet層,Struts層,持久層,JDBC層等等的執行時間。AOP很容易通過聲明pointcut 定義語言來定義這些層。
          ·靈活捕獲更詳細的統計信息。用戶使用工具提供的特性,但使用這些工具不能完全展示AOP的功能。一些新功能的統計用它幾乎不可能做到。例如:常用API的頻率分布圖,第一次和最后一次的執行時間,平均時間需要除去第一次執行的平均時間(除去第一次非常有用,因為一些API在第一次執行時做很多事情,比如讀很多的數據并緩沖數據,如果包括了第一次執行時間,那么平均頻率就不能顯示增量請求所執行時間的真實數據)。InfraRED 提供了這些統計,但不是所有。即使這些特性在核心產品中不可用,AOP工具為用戶提供了強大的自定義功能。
          ·生成調用樹(call trees)的功能,調用樹鏈接著不同的執行API的功能,使用像cflow[5] 創建的AspectJ程序,在程序可以輕易的實現此功能。

          總結
              在這里我們介紹了一個在應用程序中收集性能統計數據的靈活方法,略述了這種方法與傳統技術相比的幾個優點。這篇文章來自于我在InfraRED (http://infrared.sf.net/)中的工作經驗,一個基于AOP的開源的性能監控工具。

          參考
          1.AspectJ homepage: http://www.eclipse.org/aspectj/
          2.Introduction to AspectJ: http://www.eclipse.org/aspectj/doc/released/progguide/starting-aspectj.html
          3.AOP without the buzzwords: http://jroller.com/page/colyer?entry=the_ted_neward_challenge_aop
          4.InfraRED homepage: http://infrared.sf.net/
          5.On using AOP for Application Performance Management: http://aosd.net/2006/archive/AOSD06-IndustryTrackProceedings.pdf

          作者
             Srinivas Narayanan 是Tavant Technologies 公司的總架構師,提供軟件企業解決方案。在Tavant,他監管一些大公司的J2EE項目,并創建一套基于java程序開發的可復用的平臺。他是InfraRED項目的創始人。在Tavant之前,他工作在IBM Almaden 研究中心,在關系對象數據庫系統領域。他在一些主要的研討會上演講了數篇關于企業級應用,SOA,系統集成和數據庫的論文。他在美國麥迪遜的威斯康星大學獲得了計算機科學碩士學位,在印度 Chennai IIT 獲得計算機科學學士。
              Binil Thomas 在Tavant Technologies是副架構師。他也是InfraRED項目的參與者。他在印度喀拉拉大學獲得計算機科學學士。
              感謝:Srinivas和Binil感謝他們的同事 Kamal Govindraj 提供的幫助。


          聲明:以上翻譯是我在業余時間進行,因為英語水平有限,難免有些bug,多謝各位指教。



          一個駐扎在天津的普通程序員,當個PM,TL,CODER 就是沒有當過CEO。
          My idiom:Where there is a will,there is a way!
          注:加班寫作,轉載請著名出處!!

          posted on 2007-08-04 17:13 EugeneCao 閱讀(1347) 評論(1)  編輯  收藏 所屬分類: Development ArticleJava Development

          Feedback

          # re: 使用AOP實現性能管理[譯][未登錄] 2007-08-28 20:47 cheney

          很好,支持 !  回復  更多評論   



          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          收藏夾

          Java Blogs

          WorkFlow

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          Get Free Shots from Snap.com
          主站蜘蛛池模板: 军事| 金秀| 吴桥县| 乌拉特中旗| 鹤峰县| 霍州市| 保康县| 乡宁县| 枞阳县| 方城县| 鄂托克旗| 桑植县| 筠连县| 忻州市| 鄂尔多斯市| 田东县| 增城市| 卢氏县| 瑞昌市| 千阳县| 博白县| 龙江县| 青冈县| 酉阳| 民丰县| 和田县| 湖北省| 九龙县| 进贤县| 延津县| 库伦旗| 集贤县| 康平县| 大理市| 雷山县| 苗栗县| 连城县| 安陆市| 达州市| 阿尔山市| 湖州市|