消息的存储方式
Queue消息模型
采用存储采用先进先出(FIFO),一个消息只能被一个消费者消费,当消息被确认消费之后才会被删除。
Topic消息模型
每个订阅者获取的消息实际是消息的一个副本,只有一个消息副本会被存储,MQ 提供了一个指针来指向消息存储并且分发消息副本到订阅者,消息直到所有的持久化订阅者都被接收才能被删除。
持久化存储
- KahaDB消息存储
- AMQ消息存储
- JDBC消息存储
- 内存消息存储
KahaDB
默认的持久化方式,KahaDB存储是一个基于文件的快速存储消息,所有的消息顺序的添加到一个日志文件中,同时有另一个索引文件记录执行这些日志到存储地址,还有一个事务日志用于消息的恢复操作。
特性
- 日志形式存储消息;
- 消息索引以B-Tree结果存储,可以快速更新;
- 完全支持JMS事务;
- 支持多种恢复机制,kahadb可以限制每个数据文件的大小。
配置
在activemq.xml中配置如下:
<broker brokerName="broker" persistent="true" useShutdownHook="false">
<persistenceAdapter>
<!--directory:保存数据的目录;journalMaxFileLength:保存消息的文件大小 -->
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
</persistenceAdapter>
</broker>