簡體   English   中英

如何制作“簡單”的吞吐量servlet過濾器?

[英]How do I make “simple” throughput servlet-filter?

我正在尋找一個過濾器,該過濾器可以給我兩件事:請求數pr分鍾和平均響應時間pr分鍾。 我已經獲得了個別的讀數,我不確定如何將它們加起來。

我的過濾器捕獲每個請求,並記錄每個請求花費的時間:

public void doFilter(ServletRequest request, ...()  
{       
    long start = System.currentTimeMillis(); 
    chain.doFilter(request, response);
    long stop = System.currentTimeMillis();

    String time = Util.getTimeDifferenceInSec(start, stop);
}

這些信息將用於創建一些漂亮的Google Chart圖表。 我不想將數據存儲在任何數據庫中。 只是在需要時獲取當前號碼的一種方法

由於這是一個大批量的應用程序; 低開銷至關重要。

我假設我的應用服務器未提供此信息。

我曾經做過類似的事情。 如果我還記得的話,我有類似

public class StatisticsFilter implements ... 
{
    public static Statistics stats;

    public class PeriodicDumpStat extends Thread
    {
       ...
    }

    public void doFilter(ServletRequest request, ...()  
    {       
      long start = System.currentTimeMillis(); 
      chain.doFilter(request, response);
      long stop = System.currentTimeMillis();
      stats.add( stop - start ); 
    }

    public void init()
    {
       Thread t = new PeriodicDumpStat();
       t.setDaemon( true );
       t.start();
    }
}

(那只是一個草圖)

確保Statistics對象正確同步,因為它將同時訪問。

我有一個后台DumpStatistics線程,該線程會定期將統計信息轉儲到XML文件中,以便以后處理。 為了更好的封裝,我將線程作為內部類。 您當然也可以使用Runnable 正如@Trevor Tippins指出的那樣,將線程標記為守護線程也是很好的。

我還使用了Google Chart,實際上還有另一個ShowStatisticsServlet ,它將顯示XML文件並將數據轉換成漂亮的Chart。 該servlet將不依賴於過濾器,而僅依賴於XML文件,因此兩者實際上是分離的。 可以使用File.createTempFile將XML文件創建為臨時文件 (當然,另一個變體是將所有數據保留在內存中,但是存儲數據對於我們方便地備份性能測試的結果並在以后進行分析非常方便)

一位同事聲稱, Statistics對象中的同步會“殺死”應用程序的性能,但實際上這是可以忽略的。 假定每10秒左右完成一次,轉儲文件的開銷也是如此。

希望對您有所幫助,或者給您一些想法。

PS:正如@William Louth所說,僅當您無法使用現有解決方案解決問題時,才應編寫此類基礎結構代碼。 就我而言,我還在基准測試代碼的內部時間,而不僅僅是整個請求處理時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM