<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    fqueue初步分析

    Posted on 2011-09-16 20:10 dennis 閱讀(9225) 評論(7)  編輯  收藏 所屬分類: java源碼解讀

        fqueue是國產(chǎn)的一個類似memcacheq,kestrel這樣的支持memcached協(xié)議的輕量級開源MQ。它的項目主頁:
    http://code.google.com/p/fqueue/downloads/list,介紹和特點都可以看主頁,我就不廢話了。

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

        首先是它的存儲層,主要是一個FQueue這么一個抽象隊列,內(nèi)部實現(xiàn)是FSQueue,也就是基于文件的FIFO隊列。這個隊列是多個文件組成的。每個文件默認大小在150M,超過即切換一個新文件來寫。讀的時候如果讀到尾部,則查找下一個文件進行讀取。數(shù)據(jù)文件名以idb為后綴,并且從編號1開始遞增,除了數(shù)據(jù)文件外,每個隊列還有個db為后綴的索引文件,記錄當前寫和讀的數(shù)據(jù)文件編號和偏移量。目錄結(jié)構(gòu)大概是這樣:
        --fqueue
            --fqueuedata_1.idb
            --fqueuedata_2.idb
            --……
            --icqueue.db

        文件的存儲比較有特色,采用MappedByteBuffer做文件讀寫,MappedByteBuffer是java nio引入的文件內(nèi)存映射方案,讀寫性能極高,但是也有一定的問題,比如說內(nèi)存占用,以及數(shù)據(jù)刷入設(shè)備的不確定性和關(guān)閉問題。在fqueue中,每隔10毫秒會強制force一次buffer,將修改過的數(shù)據(jù)刷入設(shè)備。對于關(guān)閉問題,則采用那個技巧,示例代碼:
    /**
         * 關(guān)閉索引文件
         
    */
        
    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會有一定程度的阻塞現(xiàn)象。

        存儲的性能,我在我的機器測試了下,似乎沒有作者宣稱的那么高,我的機器是5400轉(zhuǎn)的普通SATA盤,寫入1K數(shù)據(jù)的平均QPS在8000左右。我估計fqueue的性能跟磁盤有很大關(guān)系,如果使用15000轉(zhuǎn)的SAS盤應(yīng)該能有很大改觀。

        網(wǎng)絡(luò)層直接使用了jmemcached的實現(xiàn),jmemcached是一個java實現(xiàn)的memcached,通常用于單元測試之類。看情況fqueue也支持memcached的二進制協(xié)議了。網(wǎng)絡(luò)框架使用了netty3,這些就不多說了。自己看都明白。額外提一下,作者做的單元測試使用了xmemcached,咔咔,廣而告之。

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

    評論

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-16 21:01 by fuyou001
    請問下 getCleanerMethod.setAccessible(true);
    sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(mappedByteBuffer,
    new Object[0]);

    這個技巧,在哪有相關(guān)文檔,看的似懂非懂的?
    在java api里MappedByteBuffer 類里沒有cleaner方法,其父類也沒有

    # re: fqueue初步分析[未登錄]  回復(fù)  更多評論   

    2011-09-16 21:17 by dennis
    @fuyou001
    看 sun.nio.ch.DirectBuffer

    MappedByteBuffer是direct buffer的一種。

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-17 01:07 by 孫立
    我是Fqueue的作者。很高興看到你的分析。
    你提到的:可能在切換文件的時候fqueue會有一定程度的阻塞現(xiàn)象。
    這個起始有考慮,每次打開,會提前預(yù)分配下一個文件避免阻塞。sun.nio.ch.DirectBuffer這個東西的使用,是當時在windows下面出現(xiàn)無法刪除的問題,但是在linux下面似乎沒有這個問題。
    單個文件的大小,推薦設(shè)置為40M左右。
    Fqueue的存儲層性能直接取決于磁盤性能。我前兩天剛測試在服務(wù)器上sas上,1K的qps有19萬。

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-17 08:55 by tb
    學習了

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-17 12:59 by dennis
    @孫立
    感謝作者的回復(fù),呵呵,我初步看了下,還不夠仔細。下周做個壓測再向你請教。

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-18 16:00 by vbg
    jmemcached 是memcached 的一個java實現(xiàn)。
    jmemcached 和 fqueue 有啥關(guān)系呀?

    它們是怎么配合的?

    # re: fqueue初步分析  回復(fù)  更多評論   

    2011-09-18 16:10 by vbg
    看了CacheStorage<String, LocalCacheElement> storage = new FSStorage();知道FSStorage是memcached實現(xiàn)的緩存存儲。
    主站蜘蛛池模板: 亚洲黄色免费在线观看| 免费看小12萝裸体视频国产| 99久热只有精品视频免费观看17| 99视频在线看观免费| 亚洲男同帅GAY片在线观看| 久久精品九九亚洲精品| 三级黄色片免费看| 亚洲午夜久久久久久久久久| 一个人看的www免费高清| 亚洲欧洲日产国码一级毛片| 亚洲午夜精品国产电影在线观看| 亚洲AV第一成肉网| 国产在线观看免费完整版中文版 | 亚洲日韩中文字幕天堂不卡 | 成年人视频在线观看免费| 2020国产精品亚洲综合网| 一级做a爱过程免费视| 国产成人高清亚洲| a毛片免费全部播放完整成| 国产极品粉嫩泬免费观看| 无套内射无矿码免费看黄| 亚洲成年人免费网站| 亚洲国产熟亚洲女视频| 日韩免费观看一区| 亚洲视频人成在线播放| 日韩a级无码免费视频| 亚洲精品在线网站| 无码精品人妻一区二区三区免费看| 亚洲A丁香五香天堂网| 亚洲欧洲日产国码久在线| 亚洲av无码天堂一区二区三区| 毛片基地看看成人免费| 亚洲欧洲日产国码高潮αv| 久久国产精品国产自线拍免费| 亚洲一区二区三区国产精品无码| 日本免费一区尤物| 野花香高清视频在线观看免费| 亚洲AV无码乱码在线观看代蜜桃| 国产大片免费观看中文字幕| 青青青国产手机频在线免费观看| 久久久久亚洲国产|