2008年3月15日 星期六

交通部OA專案Porlet平台調校 - 頁面顯示效能不佳

問題及現況描述:

  現有Apache JetSpeed portlet平台頁面顯示效能不佳。雖然影響效能的因素很多,但其中Portlet的顯示方式,給使用者的感覺乃極重要因素之一。而現行做法是以synchronous server-side aggregated方式來顯示頁面,顯示所需時間為所有區塊內容產生及組合時間的總和,此乃傳統Portal平台效能無法有效提升的重要原因。
  雖然JetSpeed 2.0也有提供asynchronous server-side aggregated方式,顯示所需時間為最大區塊內容產生及組合時間的總和,應可明顯地加速頁面的顯示速度。但可能是對原JetSpeed平台修改所造成的影響,經實際地測試之後發現,並未如預期般地,各區塊內容以非同步方式產生。而且由於整個頁面的顯示時間,會受到最慢區塊內容產生的影響,所以此種方式還是無法令使用者有較好的感受。
  專案初期所使用為Apache JetSpeed 2.0,並未提供client-side aggregated (名為desktop)顯示功能,但Apache JetSpeed 2.1已具備此功能。此方式是將各區塊內容的套版,改在client-side進行作業。而server-side產生各區塊內容的方式也有兩種: PortletAggregator及PageAggregator(預設)。具推測兩者的差異,應在於server-side中各區塊內容產生,是以同步或非同步方式進行,但client-side的套版作業將會有所不同。對使用者感受而言最佳做法,應該是以非同步的方式來產生各區塊內容(Desktop+PortletAggregator)。
  雖然平台後來也轉換為Apache jetSpeed 2.1,但經實測之後發現原平台Desktop功能是可以正確運作的,而修改後的平台卻無法運作。觀察顯示的運作模式後發現,此方式在每次submit時,還是會重新顯示整個頁面,但由於各區塊內容乃以AJAX方式套入版型之中,所以對使用者的感受而言會較可接受。當然,最好的方式是各Portlet區塊的submit,全部都改以AJAX方式處理,如此將可達到最佳顯示性能,但Portlet的開發方式必須配合才可達成此一目的。

解決方案:

  1. 解決修改後的Apache JetSpeed 2.1 portlet平台,無法使用Desktop及非同步區塊內容產生功能的問題。
  2. 改寫用於主頁面所有Portlet,將顯示及submit全部改以非同步背景方式進行;但此作法乃將系統面的問題,由應用面程式來解決的不良方案。
  3. 以Filter欄截所有的請求及回應,將Portlet的顯示及submit,全部改以非同步背景方式進行,但可行性及難度未經實際驗證及評估過。

方案1的初步嘗試:

  比較原平台及修改後平台的全部原始碼,已找出原始碼差異之所在,由於本人並非原修改者,且未經實際運作差異之比較,故短時間內尚無法理解所有修改處的原由,雖然部份修改已可約略瞭解其修改之目的,但未經原修改者或實際運用差異的比較來確認,終究無法完全瞭解修改之目的。經歷此次事件的過程,本人有以下幾點想法:

  1. 對於專案開發過程所做的任何變動,不論是關於應用面或系統面的,都必須精確地紀錄其原始及變更之目的:雖然本案有用SVN(Subversion)來進行版本控制,但卻未對修改前後的JetSpeed 2.0及2.1平台原始碼進行版本控制,以及變動歷程的紀錄,也未對所修改的部份加上詳細的註解說明,如此將會造成將來接手平台維護者及此方案所面臨的窘境。
  2. 系統修改之前應先Refactoring:將要修改的部份隔離,以增加系統原始碼的可讀性。
  3. 切莫因為不瞭解原系統設計架構或求快速達到目的,而變更原系統設計架構:原JetSpeed平台的認證及授權功能,是以標準的JAAS架構來達成。此標準的設計目的即在於,希望應用程式與平台間可以透過標準的方式來進行安全性的整合。此次平台修改卻放棄以此標準做法,而走捷徑來進行認證及授權的整合。

方案1的接續做法:

  1. 先分兩部份一起進行:A.找出造成影響的被修改模組;B.瞭解每個修改的目的。
  2. 針對造成影響的被修改模組進行改造,期使原模組功能及再修改之目的皆可達成。

沒有留言: