ActiveMq Persistence

AMQ Message Store                                                                                                                                                                       AMQ Message Store 是ActiveMQ5.0版本及以上默认的持久化存储,他是一个及其快速和可靠的可嵌入式,基于文件、事物存储的消息持久存储解决方案。消息命令被顺序追加写入事物日志,这意味着写入速度非常快,并且命令日志很容易recover(恢复)。                                                                                                                                                                       消息被存储在日志文件中,消息在日志文件位置引用被保存到另外一个存储结构(默认 kaha)。这样创建消息主键索引,并且提供缓存机制,进一步提升了性能。                                                                                                                                      对对消息的引用保存在内存中并且周期性的插入到引用store中以提升性能,                                                                                 每个日志文件的大小都是有限制的(默认32m,可自行配置,甚至这个文件大小可以更大如果消息超出了文件设定大小)。当超过这个大小,系统会重新建立一个文件。当所有的消息都消费完成,系统会删除这个文件或者归档(发生在下一次清理期间)主要的缺点是AMQ Message会为每一个Destination创建一个索引,如果使用了大量的Queue,索引文件的大小会占用很多磁盘空间。而且由于索引巨大,一旦Broker崩溃,重建索引的速度会非常慢。目前已不推荐使用。

JDBC Support                                                                                                                                                                                 支持一系列的SQL数据库用于消息持久化例如:

Apache Derby | Axion | DB2 | HSQL | Informix | MaxDB | MySQL | Oracle | Postgresql | SQLServer | Sybase

ActiveMQ自动从JDBCAdapter检测jdbc驱动,如果你的JDBC不支持请告知我们,我们会尽快修复。

首先定义一个mysql-ds的MySQL数据源,然后在persistenceAdapter节点中配置jdbcPersistenceAdapter并且引用刚才定义的数据源。

<persistenceAdapter

    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" /> 

</persistenceAdapter>

你可以用statements 来定义SQL数据类型 比如字段大小

<broker useJmx="false">

 

  <persistenceAdapter>

    <journaledJDBC useJournal="false">

      <statements>

        <statements stringIdDataType ="VARCHAR(128)"/>

      </statements>

    </journaledJDBC>

  </persistenceAdapter>

 

</broker>

如果你使用mysql作为数据源你需要设置relaxAutoCommit 为ture

<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://localhost/activemq?relaxAutoCommit=true"/>

  <property name="username" value="activemq"/>

  <property name="password" value="activemq"/>

  <property name="poolPreparedStatements" value="true"/>

</bean>

                   

KahaDB

KahaDB是一个基于文件的持久性数据库,相对于broker是本地存储。KahaDb恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ。KahaDB是从ActiveMQ 5.4开始默认的持久化插件。

Slow File System Access Diagnostic Logging(慢文件系统诊断日志)

如果你的文件系统很慢,你可以指定一个毫秒级别非0阀值来验证数据库更新速度,如果数据库操作慢于那个阀值,会打印如下日志:

Slow KahaDB access: cleanup took 1277 | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker

你可以通过系统属性来指定该值,注意匹配你的磁盘速度。你可以轻松获取由于慢文件系统引起的异常

-Dorg.apache.activemq.store.kahadb.LOG_SLOW_ACCESS_TIME=1500

Multi(m) kahaDB Persistence Adapter

从ActiveMQ 5.6开始 ActiveMQ已经支持可以通过 kahdb persistence adapters 配置多个destinations stores,什么时候需要这样做呢?

如果你有一个能进行快速消费的destination和一个周期性不规则消费的destination,导致未消费的消息会分散的存储在

多个日志文件中,那么磁盘的使用就会变的不可控,为最细力度使用日志的场景创建各自的日志存储, 甚至有些destination会要求同步访问磁盘有些不会,在这种情况下你可以使用mKahaDB persistence adapter和destinations wildcards。

如果没有目标队列提交给filteredKahaDB,那么意味着对所有的队列有效。如果一个队列没有对应的适配器,那么将会抛出一个异常

<persistenceAdapter>
  <mKahaDBdirectory="${activemq.base}/data/kahadb">
    <filteredPersistenceAdapters>
      <!-- match all queues -->
      <filteredKahaDBqueue=">">
        <persistenceAdapter>
          <kahaDBjournalMaxFileLength="32mb"/>
        </persistenceAdapter>
      </filteredKahaDB>
      
      <!-- match all destinations -->
      <filteredKahaDB>
        <persistenceAdapter>
          <kahaDBenableJournalDiskSyncs="false"/>
        </persistenceAdapter>
      </filteredKahaDB>
    </filteredPersistenceAdapters>
  </mKahaDB>
</persistenceAdapter>

如果filteredKahaDB的perDestination属性设置为true,那么匹配的目标队列将会得到自己对应的KahaDB实例。配置如下:

<persistenceAdapter>
  <mKahaDBdirectory="${activemq.base}/data/kahadb">
    <filteredPersistenceAdapters>
      <!-- kahaDB per destinations -->
      <filteredKahaDB perDestination="true">
        <persistenceAdapter>
          <kahaDBjournalMaxFileLength="32mb" />
        </persistenceAdapter>
      </filteredKahaDB>
    </filteredPersistenceAdapters>
  </mKahaDB>
</persistenceAdapter>

 

Transactions...

如果destinatios是分布式的,事物可以跨越多个日志文件,这意味着需要俩个阶段必须完成,以牺牲性能为代价去存储事物提交结果,这个性能代价只会在一个事物中涉及一个以上的日志文件出现。

补充:非持久化消息、事务内的消息均采用异步发送;对于持久化消息采用同步发送。

http://activemq.apache.org/how-do-transactions-work.html

Kaha Persistence

Kaha Peristence 是一个专门用于消息持久化的存储解决方法,是ActiveMQ项目的一部分,在持久化消息的读写和丢弃方法有很好的性能。

kaha数据存储在日志文件中 一旦日志文件中没有感兴趣的数据 该日志文件将被丢弃。

配置kaha persistence

ActiveMQ 5.0 and above:

<broker brokerName="broker" persistent="true" useShutdownHook="false">

   <transportConnectors>

     <transportConnector uri="tcp://localhost:61616"/>

   </transportConnectors>

   <persistenceAdapter>

     <kahaPersistenceAdapter directory="activemq-data" maxDataFileLength="33554432"/>

   </persistenceAdapter>

 </broker>

LevelDB Store

LevelDB 已经不再被ActiveMQ推荐使用,不做阐述....

Periodically checking disk limits

通过配置文件和节点可用磁盘空间在broker启动的时候开辟了store和temporary disk 空间。有时候其他线程(比如日志)随着日志增长磁盘可用空间就会减少,所以在broker启动时候检测到的可用磁盘空间就没有任何意义了。从ActiveMQ version 5.12.0版本,通过broker属性字段schedulePeriodForDiskUsageCheck >0,   可以配置broker周期性的检查磁盘空间,并且对配置(store,temporary disk)相应做出调整。e.g:

<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDiskUsageCheck="60000">

  ...

</broker>

每60秒将会检查store、temporary disk limits

Pluggable storage lockers

从5.7正式发布版本开始,ActiveMQ persistence adapter 可以选择以插件形式配置storage locking。这个配置只对共享存储有意义。对于KahaDB persistence adapter来说storage locking机制基于共享文件锁,类似的JDBC persistence adapter 是基于数据库支持的存储锁。现在storage locker脱离了persistence adapter(可插拔),所有的可插拔locker必须实现Locker接口,你也可以集成该接口自定义自己需要的locker。

之前每一个persistence adapter有他们自己默认的locker(估计融合到一块了,5.7实现可插拔)

.............

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值