第 7 章 集群的计数
集群计数器 是数据网格集群中的所有节点之间分布和共享的计数器。计数器可以有不同的一致性级别:强度和弱点。
虽然强/弱一致的计数器都有单独的接口,但支持更新其值,并在更新其值时返回事件。本文档中提供了详细信息,以帮助您选择最适合您的用例。
7.1. 安装和配置
要开始使用计数器,您需要在 Maven pom.xml
文件中添加依赖项:
pom.xml
<dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-clustered-counter</artifactId> </dependency>
计数器可以通过本文档后面详述的 CounterManager
接口配置数据源配置文件或按需配置。当 EmbeddedCacheManager
启动时,会在启动时在 Data Grid 配置文件中配置计数器。这些计数器会立即启动,它们在所有集群的节点中都可用。
configuration.xml
<?xml version="1.0" encoding="UTF-8"?> <infinispan> <cache-container ...> <!-- if needed to persist counter, global state needs to be configured --> <global-state> ... </global-state> <!-- your caches configuration goes here --> <counters xmlns="urn:infinispan:config:counters:11.0" num-owners="3" reliability="CONSISTENT"> <strong-counter name="c1" initial-value="1" storage="PERSISTENT"/> <strong-counter name="c2" initial-value="2" storage="VOLATILE"> <lower-bound value="0"/> </strong-counter> <strong-counter name="c3" initial-value="3" storage="PERSISTENT"> <upper-bound value="5"/> </strong-counter> <strong-counter name="c4" initial-value="4" storage="VOLATILE"> <lower-bound value="0"/> <upper-bound value="10"/> </strong-counter> <weak-counter name="c5" initial-value="5" storage="PERSISTENT" concurrency-level="1"/> </counters> </cache-container> </infinispan>
或以编程方式在 GlobalConfigurationBuilder
中:
GlobalConfigurationBuilder globalConfigurationBuilder = ...; CounterManagerConfigurationBuilder builder = globalConfigurationBuilder.addModule(CounterManagerConfigurationBuilder.class); builder.numOwner(3).reliability(Reliability.CONSISTENT); builder.addStrongCounter().name("c1").initialValue(1).storage(Storage.PERSISTENT); builder.addStrongCounter().name("c2").initialValue(2).lowerBound(0).storage(Storage.VOLATILE); builder.addStrongCounter().name("c3").initialValue(3).upperBound(5).storage(Storage.PERSISTENT); builder.addStrongCounter().name("c4").initialValue(4).lowerBound(0).upperBound(10).storage(Storage.VOLATILE); builder.addWeakCounter().name("c5").initialValue(5).concurrencyLevel(1).storage(Storage.PERSISTENT);
另一方面,可以在 EmbeddedCacheManager
初始化后随时按需配置计数器。
CounterManager manager = ...; manager.defineCounter("c1", CounterConfiguration.builder(CounterType.UNBOUNDED_STRONG).initialValue(1).storage(Storage.PERSISTENT).build()); manager.defineCounter("c2", CounterConfiguration.builder(CounterType.BOUNDED_STRONG).initialValue(2).lowerBound(0).storage(Storage.VOLATILE).build()); manager.defineCounter("c3", CounterConfiguration.builder(CounterType.BOUNDED_STRONG).initialValue(3).upperBound(5).storage(Storage.PERSISTENT).build()); manager.defineCounter("c4", CounterConfiguration.builder(CounterType.BOUNDED_STRONG).initialValue(4).lowerBound(0).upperBound(10).storage(Storage.VOLATILE).build()); manager.defineCounter("c2", CounterConfiguration.builder(CounterType.WEAK).initialValue(5).concurrencyLevel(1).storage(Storage.PERSISTENT).build());
CounterConfiguration
是不可变的,可以重复使用。
如果计数器成功配置或 false
,则方法 defineCounter ()
将返回 true
。但是,如果配置无效,方法将抛出 CounterConfigurationException
。要查找计数器是否已定义,请使用方法 defined ()
。
CounterManager manager = ... if (!manager.isDefined("someCounter")) { manager.define("someCounter", ...); }
针对集群属性:
-
num-owners
:设置计数器的副本数,以保持集群范围。较小的数量会加快更新操作,但将支持较少的服务器崩溃。它必须是正数,其默认值为2
。 可靠性
:在网络分区中设置计数器的更新行为。默认值为AVAILABLE
,有效值为:-
AVAILABLE
: 所有分区都可以读取和更新计数器的值。 -
CONSISTENT
:只有主分区(节点的主分区)将能够读取和更新计数器的值。剩余的分区只能读取其值。
-
每个计数器属性:
-
initial-value
[common] :设置计数器的初始值。默认值为0 (
零)。 Storage
[common] :设置集群关闭时和重启时计数器的行为。默认值为VOLATILE
,有效值为:-
VOLATILE
:计数器的值仅在内存中可用。当集群关闭时,该值将会丢失。 -
PERSISTENT
: 计数器的值存储在私有和本地持久性存储中。当集群重启后关闭并恢复时,该值会被保留。
-
在群集关闭后,按需和 VOLATILE
计数器将会丢失其值和配置。重启后必须再次定义它们。
-
lower-bound
[strong]:设置强度一致的计数器的下限。默认值为Long.MIN_VALUE
。 -
upper-bound
[strong]:设置强度一致的计数器的上限。默认值为Long.MAX_VALUE
。
如果没有配置 下限
或 上限
,则强大的计数器被设置为 unbounded。
initial-value
必须介于 lower-bound
和 upper-bound
inclusive内。
-
concurrency-level
[weak] :设置并发更新的数量。其 值必须是正数,默认值为16
。
7.1.1. 列出计数器名称
要列出定义的所有计数器,method CounterManager.getCounterNames ()
返回集群范围的所有计数器名称的集合。