AMQ 消息存储

功能 > 持久化 > 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

用于保存可能存储在磁盘上的瞬态消息的数据文件,以减轻内存消耗,例如,等待传递给活动但速度较慢的订阅者的非持久主题消息。

恢复