简介

从ActiveMQ5.6开始,可以跨多个kahdb持久性适配器分发目标存储。当您的目的地具有不同的性能概要文件或不同的持久性需求时,您可以将它们分布在多个KahaDB消息存储中。

当broker管理的所有Destination有相似的性能和可靠性时,默认的KahaDB持久性存储适配器工作良好。当一个Destination有完全不同的性能配置文件时,例如,与其他Destination上的消费者相比,该Destination上的消费者异常缓慢,存储消息的磁盘使用量将会快速增长。当一个或多个Destination不需要 磁盘同步,而其他的Destination需要磁盘同步时,所有的Destination都将受到性能影响。

多KahaDB持久性适配器允许您跨多个KahaDB消息存储分发broker的Destination。使用多个消息存储允许您使用它更精确地定制消息存储以满足Destination的需要。 使用采用标准通配符语法的过滤器匹配Destination和存储。

配置

多KahaDB持久性适配器配置包含多个KahaDB消息存储配置。使用mKahaDB元素指定多KahaDB持久性适配器配置。 mKahaDB元素具有单个属性directory,用于指定适配器写入其数据存储的位置。 此设置是内嵌的KahaDB消息存储库实例的目录属性的默认值。 各个消息存储库可以覆盖此默认设置。

mKahaDB元素有一个子元素filteredPersistenceAdapters。filteredPersistenceAdapters元素包含多个filteredKahaDB元素,用于配置持久性适配器使用的KahaDB消息存储。

每个filteredKahaDB元素配置一个KahaDB消息存储(除了perDestination属性设置为true的情况)。 使用filteredKahaDB元素上的属性指定与消息存储库匹配的Destination:

  • queue——指定queue的名称
  • topic——指定topic的名称

可以使用显式目标名称或使用通配符指定目标。如果未指定目标,则消息存储将匹配其他筛选器未匹配的任何Destination。

在filteredKahaDB元素中配置的KahaDB消息存储使用标准的KahaDB持久性适配器配置进行配置。
它由一个包含在persistenceAdapter元素中的kahaDB元素组成。

通配符语法

您可以使用通配符指定一组Destination名称。 这对于在联合层次结构中设置目标的情况很有用。

  • .分离路径名称
  • * 匹配路径中的任意名称
  • > 匹配任意以该名称开头的Destination

配置示例

从ActiveMQ 5.15开始,filteredKahaDB支持名为usage的StoreUsage属性。 这允许对匹配的队列施加单独的磁盘限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<broker brokerName="broker">

<persistenceAdapter>
<mKahaDB directory="${activemq.base}/data/kahadb">
<filteredPersistenceAdapters>
<!-- match all queues -->
<filteredKahaDB queue=">">
<usage>
<storeUsage limit="1g" />
</usage>
<persistenceAdapter>
<kahaDB journalMaxFileLength="32mb"/>
</persistenceAdapter>
</filteredKahaDB>

<!-- match all destinations -->
<filteredKahaDB>
<persistenceAdapter>
<kahaDB enableJournalDiskSyncs="false"/>
</persistenceAdapter>
</filteredKahaDB>
</filteredPersistenceAdapters>
</mKahaDB>
</persistenceAdapter>

</broker>

上面的配置表示:所有的queue使用第一个消息存储适配器,其他的目的地(这里就是所有的topic)使用第二个消息存储适配器。

为每个Destination指定一个持久性适配器

如果filteredKahaDB元素的perDestination设置为true,且没有指定任何的queue和topic,那么每个Destination将有自己的KahaDB实例。

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<broker brokerName="broker" ... >
<persistenceAdapter>
<mKahaDB directory="${activemq.base}/data/kahadb">
<filteredPersistenceAdapters>
<!-- kahaDB per destinations -->
<filteredKahaDB perDestination="true" >
<persistenceAdapter>
<kahaDB journalMaxFileLength="32mb" />
</persistenceAdapter>
</filteredKahaDB>
</filteredPersistenceAdapters>
</mKahaDB>
</persistenceAdapter>
...
</broker>

注意:perDestination属性和queue或topic属性组合尚未经过验证,可能会抛出下面的异常:
Reason: java.io.IOException: File ‘/opt/java/apache-activemq-5.9.0/data/mKahaDB/lock’ could not be locked as lock is already held for this jvm

事物

如果Destination是分布式的,事务可以跨越多个日志。这意味着需要完成两个阶段。这确实会导致记录提交结果的额外磁盘同步的性能损失。

如果事务中只涉及一个日志,则不使用额外的磁盘同步。 在这种情况下不会产生性能损失。

参考:USING A MULTI KAHADB PERSISTENCE ADAPTER
参考:http://activemq.apache.org/kahadb.html