ActiveMQ 中主要提供三种持久化机制:
- KahaDB:默认的持久化方式,消息持久化到文件系统。
- JDBC:消息持久化到关系数据库中。
- LevelDB:消息持久化到LevelDB数据库中。
这三种方式的主要区别在于:
- 性能:LevelDB > KahaDB > JDBC。LevelDB性能最高,JDBC性能较低。
- 可靠性:JDBC > KahaDB > LevelDB。JDBC数据可靠性最高,LevelDB略低。
- 配置难易度: KahaDB > LevelDB > JDBC。JDBC配置最复杂,KahaDB最简单。
- 扩展性:LevelDB > JDBC > KahaDB。LevelDB扩展性较好,KahaDB较差。
- 依赖性:LevelDB和KahaDB不依赖外部系统,JDBC依赖数据库。
示例配置:
KahaDB:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
JDBC:
<persistenceFactory>
<jdbcPersistenceAdapter dataDirectory="${activemq.data}"
dataSource="#mysql-ds" dialect="mysql"/>
</persistenceFactory>
LevelDB:
<persistenceFactory>
<levelDB />
</persistenceFactory>
性能测试报告:
|方式|消息数(M)|时间(s)|吞吐量(msg/s)|
|:----:|:---:|:---:|:---:|
|KahaDB|100|222|451,358|
|JDBC|100|514|194,937|
|LevelDB|100|145|690,345|
LevelDB的吞吐量是JDBC的3.5倍和KahaDB的1.5倍。
所以,选择何种持久化方式需要根据应用场景进行权衡:
追求高性能 -> LevelDB
需要高可靠性 -> JDBC
简单部署 -> KahaDB
KahaDB作为默认方式,可以满足大多数场景下的需求,对开发人员也最友好。LevelDB和JDBC可以根据实际需要选择。