5.2KahaDB消息仓库(二)

5.2.1KahaDB消息仓库内部组件
KahaDB消息仓库是所有提供个的消息仓库实现中最快的。它的速度是由于组合了包含数据日志文件的快速的事务性日报,高度优化的消息ID索引,和内存内消息缓存。图5.3(图略)提供了一张上层KahaDB消息仓库图。
●数据日志(Data logs):作为消息日报,它包含了存储在一定长度的数据文件的一个消息轮环日志和命令(例如事务性范围和消息删除)。如果当前使用的文件已达到最大长度,会创建一个新的数据文件。在数据文件中的所有消息被参考计算,所以一旦那个数据文件中的每个消息不再被需要,消息文件能被删除或存档。在数据日志中,消息只被附加到当前数据文件的尾部,所以存储很快。
●cache:如果消息有活动的消费者,则缓存(cache)临时保存消息。如果有活动的消费者,当消息被安排存储的时候同时被分派出去了。如果消息及时回应,那个它们不必存到磁盘中。
●BTree 索引:在由消息ID索引的数据日志中BTree 索引保存这些数据的说明。这些索引为队列维护先进先出数据结构,为主题消息维护持续订阅者指针。重做日志仅当ActiveMQ代理没有干净地停掉时被使用,并被用来确保维护完整的BTree索引。
KahaDB为它的数据日志和索引使用磁盘上不同的文件,所以在下一节我们会展示一个代表性的KahaDB目录结构。
5.2.2KahaDB消息仓库目录结构
当你启动一个配置使用KahaDB仓库的ActiveMQ代理,目录会自动被创建于持久化消息存储的地方。目录结构如图5.4所示(图略)。
在KahaDB目录内部,下面的目录和文件结构能被找到:
数据库日志文件(db log files)--KahaDB存储消息到命名为db-<Number>.log的事先定义好大小的日志文件。当一个数据日志满了,一个新的会被建立,并且日志的数字增加。当日志文件中的任何消息不再有引用到它们,日志文件会被删除会归档。
归档目录(archive directory)--这仅存在于归档被激活的情况。归档被用来存储不再被KahaDB需要的存储数据日志,使它在以后可能从归档数据日志中重现。如果归档没有被激活(默认情况),不再被使用的数据日志会从文件系统中删除。
db.data--这个文件包含了保存在消息数据日志中的消息的持久化BTree索引。
db.redo--这是一个重做文件,如果KahaDB消息存储在强制停止后启动,用于恢复BTree索引。
现在我们已经介绍了KahaDB仓库的基础知识,下一步是回顾它的配置。
5.2.3配置KahaDB消息仓库
KahaDB消息仓库能在activemq.xml文件中配置。如表5.1所描述的,它的配置选项控制控制不同的协调参数。
Table 5.1 Configuration options available for the KahaDB message store:
属性名称 默认值 描述
directory activmq-data KahadB使用的目录路径
indexWriteBatchSize 1000 批量写到磁盘上的索引页面的数量
indexCacheSize 10000 在内存中缓存的索引页面数量
enableIndexWriteAsync false 如果设置,会异步地写索引
journalMaxFileLength 32mb 设置每个消息数据日志的最大大小的提示
enableJournalDiskSyncs true 保证每个非事务性日报之后是磁盘同步(JMS持久化需求)
cleanupInterval 30000 检查和丢弃/移动不再用的消息之前的时间(毫秒)
checkpointInterval 5000 日报检查前的时间(毫秒)
ignoreMissingJournalfiles false 如果被激活,会忽略丢失的日志文件
checkForCorruptJournalFiles false 如果被激活,在启动时会验证消息数据日志没有损坏
checksumJournalFiles false 如果激活,会提供每个消息数据日志的校验和
archiveDataLogs false 如果激活会将消息数据日志移动到归档目录而不是删除
directoryArchive null 定义当数据日志包含的所有消息被消费的时候数据日志移动到的目录
databaseLockedWaitDelay 10000 尝试获取数据库锁前的时间(被共享的master/slave使用)
maxAsyncJobs 10000 排队唤醒仓库的异步消息的最大值(应该与并发消息生产者数一致)
concurrentStoreAndDispatchTransactions true 激活消息的调度来吸引客户端与事务性仓库并发发生
concurrentStoreAndDispatchTopics true 激活主题的调度来吸引客户端与事务性仓库并发发生
concurrentStoreAndDispatchQueues true 激活队列的调度来吸引客户端与事务性仓库并发发生

ActiveMQ为消息仓库提供了一个插件式的API,并且除了给KahaDB,ActiveMQ附带有三个额外的实现:
AMQ消息仓库--一个为性能设计的基于文件的消息仓库
JDBC消息仓库--一个基于JDBC的消息仓库
Memory消息仓库--一个基于内存的消息仓库
我们将在下面的三节看看使用例子和为额外的消息仓库的配置。我们将从AMQ消息仓库开始,它像KahaDB消息仓库是基于文件的实现。它早于KahaDB,但是因为它的性能特定,代替KahaDB使用AMQ仓库有意义,提供的持久化目标数相对较低。

猜你喜欢

转载自flxchy4.iteye.com/blog/1696667
5.2