第一次寫技術類部落格,寫的不好還請見諒,閱畢請使勁踩,用力蹬,多提拔,狂灌水……
最近在學習《ActiveMQ in action》原版,關于存儲部分,在這裡就不翻譯原文了,網上有一些童鞋已經發過翻譯的,以下内容100% pure 是自己的了解和分析,可能有不準确的地方,僅供參考,并歡迎指正。
上圖是自己做的ppt裡的一頁,作為背景介紹。下面是正文。
ActiveMQ有四種存儲器,下面分别介紹和分析各自的特點和優缺點。
1、KahaDB message store:是ActiveMQ的預設以及推薦的存儲器,特點是基于檔案、支援事務日志、可靠、可擴充、速度快等。重點讨論一下後兩點。
可擴充展現在KahaDB支援其他三種存儲器的外接擴充,也就是說可以同時用不止一種,這樣可以取長補短,适合更廣的應用場景,達到性能最佳。
速度快,書中也總結了3點:(1)快速的事務日志;(2)高度優化的消息ID索引;(3)在記憶體中的消息緩存。具體分析,消息直接添加在目前日志檔案的尾部,是以存的快;用一個索引檔案存儲所有的destination,可謂高度優化;支援記憶體緩存也是必然,但在緩存回複政策上不如記憶體存儲器。
2、AMQ message store:在基于檔案、支援事務方面和KahaDB類似。不同之處如下:
優點:索引用的是hashbin(哈希桶,沒有查到權威定義,可了解為哈希表),自然比KahaDB的Btree索引要快,并且磁盤讀寫用的是nio,速度也快,是以用于消息吞吐量要求比較大的時候是最佳選擇。(有的人把吞吐量了解成消息總數量其實不正确,應該是消息出入隊的速率。)
缺點:對于每個destination都要建一個索引,是以不适于很多destination并發的場合,而這恰恰是KahaDB的優勢,它可以支援最大10000個queue的同時等待。
3、JDBC message store:預設的JDBC驅動是ApacheDerby,同時支援MySQL、PostgreSQL、Oracle、SQLServer、Sybase、Informix、MaxDB等主流的關系資料庫。用三張表結構來存儲消息,分别是ACTIVEMQ_MSGS、ACTIVEMQ_ACKS、ACTIVEMQ_LOCK。第二張表外鍵關聯到第一張表,共同存儲消息,第三張表用于鎖定保證隻有一個broker執行個體可以通路資料庫。(關于Derby這裡不作介紹,可自行查閱)
4、Memory message store:用于實時消息的緩存,隻針對非持久訂閱的消費者提供了5種訂閱恢複政策,可以極大程度增強非持久訂閱的可用性。也就是說對于持久訂閱的消費者是用不到記憶體存儲的。
以上是我的學習心得,有很多是自己的了解,不一定全部正确,希望感興趣的童鞋們一起探讨。