activeMQ持久化消息和非持久化消息的存储原理

正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的。能够存储的最大消息数在/conf/activemq.xml文件中的systemUsage节点配置,如下:

 <systemUsage>
            <systemUsage>
                <memoryUsage>
//该子标记设置整个ActiveMQ节点的“可用内存限制”。这个值不能超过ActiveMQ本身设置的最大内存大小。其中的percentOfJvmHeap属性表示百分比。占用70%的堆内存
                    <memoryUsage percentOfJvmHeap="70" />
                </memoryUsage>
                <storeUsage>
//该标记设置整个ActiveMQ节点,用于存储“持久化消息”的“可用磁盘空间”。该子标记的limit属性必须要进行设置
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
//一旦ActiveMQ服务节点存储的消息达到了memoryUsage的限制,非持久化消息就会被转储到 temp store区域,虽然我们说过非持久化消息不进行持久化存储,但是ActiveMQ为了防止“数据洪峰”出现时非持久化消息大量堆积致使内存耗尽的情况出现,还是会将非持久化消息写入到磁盘的临时区域——temp store。这个子标记就是为了设置这个temp store区域的“可用磁盘空间限制”  ,服务重启时写入到磁盘临时区域的数据不能被恢复
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

activeMQ支持的持久化类型
1)KahaDB存储(默认存储方式)
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志 和 一个索引文件来存储它所有的地址。 配置方式:activemq.xml中

  <persistenceAdapter>
           <kahaDB directory="${activemq.data}/kahadb"/>
  </persistenceAdapter>

存储原理:kahadb数据目录下有四种文件
db.data: 消息的索引文件 ,本质上是B-Tree (与mysql索引结构类似)指向db-.log中的消息
db.redo: 用来进行消息恢复
db-
.log :储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增
lock: 锁,表示当前获得kahadb读写权限的broker

2)JDBC存储
使用JDBC持久化方式,数据库会创建3个表:activemq_msgs,activemq_acks和activemq_lock
activemq_msgs 消息表,queue和topic都存在这个表中
activemq_acks 存储持久订阅的信息和最后一个持久订阅接收的消息ID
activemq_lock 锁表,用来确保某一时刻,只能有一个ActiveMQ broker实例来访问数据库
配置方式
a) persistenceAdapter 配置

<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="# MySQL-DS " createTablesOnStartup="true" />
</persistenceAdapter>

b)配置连接池信息

<bean id="Mysql-DS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.11.156:3306/activemq?
relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>

c )添加依赖的数据库连接jar包以及连接池jar包

3)Memory存储
不需要持久化 使用 配置方式

<beans>
<broker brokerName="test-broker" persistent="false"
xmlns="http://activemq.apache.org/schema/core">
<transportConnectors>
<transportConnector uri="tcp://localhost:61635"/>
</transportConnectors> </broker>
</beans>

4)LevelDB存储
LevelDB持久化性能高于KahaDB,虽然目前默认的持久化方式仍然是KahaDB。并且,在ActiveMQ 5.9版本提供
了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。
不过,据ActiveMQ官网对LevelDB的表述:LevelDB官方建议使用以及不再支持,推荐使用的是KahaDB
配置:

<persistenceAdapter>
<levelDBdirectory="activemq-data"/>
</persistenceAdapter>

5)JDBC With ActiveMQ Journal
这种方式克服了JDBC Store的不足,JDBC持久化方式每次消息过来,都需要去写库和读库。ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能。当消费者的消费速度能够及时跟上生产者消息的生产速度时,journal文件能够大大减少需要写入到DB中的消息。
举个例子,生产者生产了1000条消息,这1000条消息会保存到journal文件,如果消费者的消费速度很快的情况
下,在journal文件还没有同步到DB之前,消费者已经消费了90%的以上的消息,那么这个时候只需要同步剩余的
10%的消息到DB。
配置方式

<persistenceFactory>
<journalPersistenceAdapterFactory dataSource="#Mysql-DS" dataDirectory="activemq-data"/>
</persistenceFactory>

猜你喜欢

转载自blog.csdn.net/zhangxm_qz/article/details/87969427