AMQ 消息存储
基础知识
这是 AcitveMQ 5 及更高版本默认的存储方式。AMQ 消息存储是一种可嵌入的、事务性的消息存储解决方案,它速度极快且可靠。
消息命令被写入一个事务性日志(它包含滚动数据日志),这意味着写入速度非常快,并且存储的状态很容易恢复。
消息本身保存在日志的数据日志中,对它们位置的引用被一个引用存储(默认情况下为 Kaha)保存,以便快速检索。
对消息的引用保存在内存中,并定期插入引用存储中以提高性能。
消息存储在数据日志中,数据日志是单个文件,通常大小为 32mb(虽然这可以通过配置进行更改,如果消息的大小大于文件大小,则它们可以更大)。当数据日志中的所有消息都被成功消费后,该数据日志文件就被标记为准备删除或归档,这将在下次清理周期发生。
配置
默认情况下,ActiveMQ Classic 将使用 AMQ 存储及其默认设置。但是,您可以通过明确定义其持久化适配器(amqPersistenceAdapter)来配置 AMQ 存储的属性。
<broker brokerName="broker" persistent="true" useShutdownHook="false">
<persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.base}/activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://127.0.0.1:61616"/>
</transportConnectors>
</broker>
以上显示了通过其 amqPersistenceAdapter 设置 AMQ 存储所需的配置,并明确设置 directory 和 maxFileLength 属性。
AMQ 存储属性
属性名称 | 默认值 | 注释 |
---|---|---|
directory |
activemq-data | 用于存储消息存储数据和日志文件的目录的路径 |
useNIO |
true | 使用 NIO 将消息写入数据日志 |
syncOnWrite |
false | 同步每个写入磁盘 |
maxFileLength |
32mb | 设置消息数据日志最大大小的提示 |
persistentIndex |
true | true |
为消息日志使用持久索引。如果为 false,则维护一个内存中结构 |
maxCheckpointMessageAddSize | 4kb |
在自动提交之前要保留在事务中的消息的最大数量 |
30000 | cleanupInterval |
检查是否要丢弃/移动不再使用的消息数据日志的时间(毫秒) |
1024 | indexBinSize |
索引使用的默认 bin 数。bin 大小越大,索引的相对性能越好 |
96 | indexKeySize |
索引键的大小,键是消息 ID |
indexPageSize | 16kb |
索引页面的大小,页面越大,索引的写入性能越好 |
directoryArchive | archive |
用于存储已丢弃的数据日志的目录的路径 |
false | archiveDataLogs |
如果为 true,数据日志将移至存档目录,而不是被删除
数据结构
在为 AMQ 存储定义的数据目录中,存在以下目录结构
顶层
消息代理的名称用于区分其消息数据的目录。默认情况下,代理名称是本地主机。
directoryArchive
在此顶层目录之下,存在以下子目录
archive
当消息数据日志被丢弃时,它们会被移到这里。
注意:此目录仅在 archiveDataLogs 属性启用时存在
journal
用于保存消息数据日志
kr-store
Kaha 引用存储的目录结构(如果使用)
data
用于引用日志中消息数据日志以进行快速检索的索引
state
存储的状态,即持久订阅者的名称,其原因在 恢复 中描述
tmp-storage
用于保存可能存储在磁盘上的瞬态消息的数据文件,以减轻内存消耗,例如,等待传递给活动但速度较慢的订阅者的非持久主题消息。