天天看點

fqueue初步分析

   fqueue是國産的一個類似memcacheq,kestrel這樣的支援memcached協定的輕量級開源mq。它的項目首頁:

    今天老大提到, co了源碼看了下,寫個初步分析報告。

    首先是它的存儲層,主要是一個fqueue這麼一個抽象隊列,内部實作是fsqueue,也就是基于檔案的fifo隊列。這個隊列是多個檔案組成的。每個檔案預設大小在150m,超過即切換一個新檔案來寫。讀的時候如果讀到尾部,則查找下一個檔案進行讀取。資料檔案名以idb為字尾,并且從編号1開始遞增,除了資料檔案外,每個隊列還有個db為字尾的索引檔案,記錄目前寫和讀的資料檔案編号和偏移量。目錄結構大概是這樣:

    --fqueue

        --fqueuedata_1.idb

        --fqueuedata_2.idb

        --……

        --icqueue.db

/**

     * 關閉索引檔案

     */

    public void close() {

        try {

            mappedbytebuffer.force();

            accesscontroller.doprivileged(new privilegedaction<object>() {

                public object run() {

                    try {

                        method getcleanermethod = mappedbytebuffer.getclass().getmethod("cleaner", new class[0]);

                        getcleanermethod.setaccessible(true);

                        sun.misc.cleaner cleaner = (sun.misc.cleaner) getcleanermethod.invoke(mappedbytebuffer,

                                new object[0]);

                        cleaner.clean();

                    } catch (exception e) {

                        log.error("close logindexy file error:", e);

                    }

                    return null;

                }

            });

            fc.close();

            dbrandfile.close();

            mappedbytebuffer = null;

            fc = null;

            dbrandfile = null;

        } catch (ioexception e) {

            log.error("close logindex file error:", e);

        }

    }

    利用反射,并且使用了sun特有的類,不具有可移植性。mappedbytebuffer還有一個問題是map的代價比較高,可能在切換檔案的時候fqueue會有一定程度的阻塞現象。

    存儲的性能,我在我的機器測試了下,似乎沒有作者宣稱的那麼高,我的機器是5400轉的普通sata盤,寫入1k資料的平均qps在8000左右。我估計fqueue的性能跟磁盤有很大關系,如果使用15000轉的sas盤應該能有很大改觀。

    總體來說fqueue是一個整體上很清爽和輕量級的mq實作,适合一些特定的場景,至于性能,我們下周準備做個壓測,到時候再談吧。

文章轉自莊周夢蝶  ,原文釋出時間 2011-09-16