第一次写技术类博客,写的不好还请见谅,阅毕请使劲踩,用力蹬,多提拔,狂灌水……
最近在学习《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种订阅恢复策略,可以极大程度增强非持久订阅的可用性。也就是说对于持久订阅的消费者是用不到内存存储的。
以上是我的学习心得,有很多是自己的理解,不一定全部正确,希望感兴趣的童鞋们一起探讨。