使用AOP實現(xiàn)性能管理[譯]
From:http://www.theserverside.com/tt/knowledgecenter/knowledgecenter.tss?l=AOPforAPM
介紹:
應(yīng)用開發(fā)人員使用一些傳統(tǒng)的技術(shù)去監(jiān)控性能管理。使用像PotimizeIt,JProbe 等通用的調(diào)試工具。另一個傳統(tǒng)的方法是在代碼的特殊地方插入時間和有用的信息。商業(yè)的性能管理工具同樣使用不同的技術(shù),例如 在類裝載時的字節(jié)碼探測,或者使用應(yīng)用服務(wù)器的攔截器去修飾類。在此文中,我們介紹 一種 使用 Aspect Oriented Programming (AOP)的靈活多變的機制來處理應(yīng)用程序性能管理。
注意:我們使用AspectJ[1] AOP庫去闡述這種方法,此技術(shù)可適用于任意的AOP程序。
方法:
在插圖1中,使用AOP技術(shù)“編織”的性能監(jiān)視代碼自動插入到已存在的應(yīng)用程序中。為了更容易些,我們把性能監(jiān)控邏輯(例如:計時器,統(tǒng)計計算等)劃分成簡單的庫。傳統(tǒng)方法是手動編碼將程序庫放到應(yīng)用程序中,這種方法單調(diào)乏味并且易錯。另一個好方法就是使用AOP特性,在應(yīng)用程序中聲明性能監(jiān)視庫需要創(chuàng)建的不同點,AOP工具 允許修改字節(jié)碼并自動插入到這些調(diào)用中。
Figure 1: High-level Architecture
實現(xiàn):
我先從MonitoringFacade 類開始,它能計算一個API的執(zhí)行時間。
public static long begin(Class clazz,
String method, String layer) { /* .. */ }
public static end(long startTime,
Class clazz, String method, String layer) { /* .. */ }
}
我們需要 在應(yīng)用程序執(zhí)行有意義地方的前或者后調(diào)用MonitoringFacade的一對begin/end方法。MonitoringFacade 類是一個普通的Java類,它來計算時間和使用統(tǒng)計,像min,max,average,first和last執(zhí)行時間,這些是創(chuàng)建調(diào)用樹(call trees)所需要的,把這些測量數(shù)據(jù)與那些收集上來的系統(tǒng)中的其他部分聯(lián)系起來。我們寫一個 abstract aspect ,它來調(diào)用MonitoringFacade。
/**
* 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 的具體實現(xiàn) 為被監(jiān)控的特殊操作提供了切入點,例如session bean調(diào)用,Struts 執(zhí)行,entity bean調(diào)用,Hibernate 查詢等。他們同樣提供一個layer name(例如:“Struts”,“Hibernate”等等),它關(guān)系到被收集的統(tǒng)計數(shù)據(jù)。這讓我們提供感興趣的統(tǒng)計,例如某層執(zhí)行花費的全部時間,這些有利于性能和伸縮性分析。
我們已經(jīng)編寫一個具體的aspect,我們需要將它們“編織”到應(yīng)用程序類中。“編織”是一個修改應(yīng)用程序類字節(jié)碼并插入Facade調(diào)用的過程。AspectJ 提供工具去做此事。
下面是一個具體的HibernateAspect類,它在"Hibernate Query" 范圍內(nèi),定位和記錄所有Hibernate的查詢時間。
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 執(zhí)行時,JDBC 語句執(zhí)行等等。如果需要的話,可以暴露pointcut定義,讓用戶很容易定制期望被監(jiān)視的部分應(yīng)用程序。
優(yōu)點:
與其他方法相比,考慮更多高級的定制和更強的靈活性可以使用AOP工具的強大功能。下面列舉一些優(yōu)點:
·選擇性的監(jiān)控部分的應(yīng)用程序而不是使用包名和API名去限制。pointcut定義語言有杠桿作用的功能,例如:監(jiān)控APIs僅僅在當(dāng)前執(zhí)行上下文(使用AspectJ特性,像cflow),基于參數(shù)和它們的類型監(jiān)視APIs,等等。
·在一個高層粒度去捕獲統(tǒng)計的功能。舉例:很容易收集在servlet層,Struts層,持久層,JDBC層等等的執(zhí)行時間。AOP很容易通過聲明pointcut 定義語言來定義這些層。
·靈活捕獲更詳細(xì)的統(tǒng)計信息。用戶使用工具提供的特性,但使用這些工具不能完全展示AOP的功能。一些新功能的統(tǒng)計用它幾乎不可能做到。例如:常用API的頻率分布圖,第一次和最后一次的執(zhí)行時間,平均時間需要除去第一次執(zhí)行的平均時間(除去第一次非常有用,因為一些API在第一次執(zhí)行時做很多事情,比如讀很多的數(shù)據(jù)并緩沖數(shù)據(jù),如果包括了第一次執(zhí)行時間,那么平均頻率就不能顯示增量請求所執(zhí)行時間的真實數(shù)據(jù))。InfraRED 提供了這些統(tǒng)計,但不是所有。即使這些特性在核心產(chǎn)品中不可用,AOP工具為用戶提供了強大的自定義功能。
·生成調(diào)用樹(call trees)的功能,調(diào)用樹鏈接著不同的執(zhí)行API的功能,使用像cflow[5] 創(chuàng)建的AspectJ程序,在程序可以輕易的實現(xiàn)此功能。
總結(jié):
在這里我們介紹了一個在應(yīng)用程序中收集性能統(tǒng)計數(shù)據(jù)的靈活方法,略述了這種方法與傳統(tǒng)技術(shù)相比的幾個優(yōu)點。這篇文章來自于我在InfraRED (http://infrared.sf.net/)中的工作經(jīng)驗,一個基于AOP的開源的性能監(jiān)控工具。
參考:
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 公司的總架構(gòu)師,提供軟件企業(yè)解決方案。在Tavant,他監(jiān)管一些大公司的J2EE項目,并創(chuàng)建一套基于java程序開發(fā)的可復(fù)用的平臺。他是InfraRED項目的創(chuàng)始人。在Tavant之前,他工作在IBM Almaden 研究中心,在關(guān)系對象數(shù)據(jù)庫系統(tǒng)領(lǐng)域。他在一些主要的研討會上演講了數(shù)篇關(guān)于企業(yè)級應(yīng)用,SOA,系統(tǒng)集成和數(shù)據(jù)庫的論文。他在美國麥迪遜的威斯康星大學(xué)獲得了計算機科學(xué)碩士學(xué)位,在印度 Chennai IIT 獲得計算機科學(xué)學(xué)士。
Binil Thomas 在Tavant Technologies是副架構(gòu)師。他也是InfraRED項目的參與者。他在印度喀拉拉大學(xué)獲得計算機科學(xué)學(xué)士。
感謝:Srinivas和Binil感謝他們的同事 Kamal Govindraj 提供的幫助。
聲明:以上翻譯是我在業(yè)余時間進(jìn)行,因為英語水平有限,難免有些bug,多謝各位指教。
一個駐扎在天津的普通程序員,當(dāng)個PM,TL,CODER 就是沒有當(dāng)過CEO。
My idiom:Where there is a will,there is a way!
注:加班寫作,轉(zhuǎn)載請著名出處!!
posted on 2007-08-04 17:13 EugeneCao 閱讀(1346) 評論(1) 編輯 收藏 所屬分類: Development Article 、Java Development