ActiveMQ的消息存储持久化

概述

  • ActiveMQ不仅支持persistent和non_persistent两种方式,还支持消息的恢复(recovery)方式

PTP

  • Queue的存储是很简单的,就是一个先进先出(FIFO)的Queue

PUB/SUB

  • 对于持久化订阅的主题,每一个消费者将获得一个消息的复制

有效的消息存储

  • ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种:
  1. AMQ消息存储:基于文件的存储方式,是以前的默认消息存储
  2. KahaDB消息存储:提供了容量的提升和恢复能力,是以前默认的存储方式【版本5.9
  3. JDBC消息存储:消息基于JDBC的存储【表中
  4. Menory消息存储:基于内存的消息存储

KahaDB Message Store概述

  • KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址
  • KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在Kaha中,数据被追加到data logs中。当不再需要log文件中的数据时,log文件会被丢弃

KahaDB基本配置例子

  • 可用的属性有:
    • director:KahaDB存放的路径,默认值activemq-data
    • indexWriteBatchSize:批量写入磁盘的索引page数量,默认值1000
    • indexCacheSize:内存中缓存索引page的数量,默认值10000
    • enableIndexWriteAsync:是否异步写出索引,默认false
    • journalMaxFileLength:设置消息data log的大小,默认是32MB
    • endableJournalDiskSyncs:设置是否保证每个没有事务的内容,被同步写入磁盘,JMS持久化的时候需要,默认为true
    • cleanupInterval:在检查到不再使用的消息后,在具体删除消息前的时间,默认30000
    • checkpointInterval:checkpoint的间隔时间,默认5000
    • ignoreMissingJournalfiles:是否忽略丢失的消息日志文件,默认是false
    • checkForCorruptJournalFiles:在启动的时候,将会验证消息文件是否损坏,默认false
    • checkksumJournalFiles:是否为每个消息日志文件提供checksum,默认false
    • archiveDataLogs:是否移动文件到特定的路径,而不是删除他们,默认false
    • directoryArchive:定义消息已经被消费过后,移动data log到的路径,默认null
    • databaseLockedWaitDelay:获得数据库锁的等待时间(used by shared master/slave),默认10000
    • maxAsyncJobs:设置最大的可以存储的异步消息队列,默认值10000,可以和concurrent MessageProducers设置成一样的值
    • concurrentStoreAndDispatchTransactions:是否分发消息到客户端,同时事务存储消息,默认true
    • concurrentStoreAndDispatchTopics:是否分发Topic消息到客户端,同时进行存储,默认true
    • concurrentStoreAndDispatchQueue:是否分发Queue消息到客户端,同时进行存储,默认为true

在Java中内嵌使用Broker,使用KahaDB例子

  •  

AMQ Message Store概述

  • 配置示例:
<broker brokerName="broker" persistent="true" useShutdownHook="false">
    <persistenceAdapter>
        <amqPersistenceAdapter directory="${activemq.base}/data" maxFileLength="32mb"/>
    </persistenceAdapter>
</broker>

 

使用JDBC来持久化消息

  •  ActiveMQ支持使用JDBC来持久化消息,预定义的表如下:
    • 消息表,缺省表名为ACTIVEMQ MSGS,queue和topic都存在里边,结构如下:
    • ACTIVEMQ_ACKS表存储持久订阅的信息和最后一个持久订阅接收的消息ID,结构如下:
    • 锁定表,缺省表名为ACTIVEMQ_LOCK,用来确保在某一时刻,只能有一个ActiveMQ broker实例来访问数据库,结构如下:
  • 配置示例【注意:里边的bean放到</broker>之外
  • JDBC Message Store with ActiveMQ Journal
    • 这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大提高了性能。配置如下:
  • ​​​​​​​JDBC Store和JDBC Message Store with ActiveMQ Journal的区别
    • ​​​​​​​JDBC with Journal的性能优于JDBC
    • JDBC用于master/slave模式的数据库分享
    • JDBC with Journal不能用于master/slave模式
    • 一般情况下,推荐使用JDBC with journal

Memory Message Store

  • 内存消息存储主要是存储所有的持久化的消息内存中。这里没有动态的缓存存在,所有你必须注意设置你的broker所在的JVM和内存限制
  • Memory Message Store配置示例:
    • ​​​​​​​
  • ​​​​​​​在Java中内嵌使用Broker,使用Memory的例子
    • ​​​​​​​
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值