Infinispan中集群侦听器在具有多个密钥的Cache中的可扩展性



在Infinispan中使用嵌入式缓存时,我希望有一个经过过滤的集群侦听器,每次更新特定密钥时都会收到通知。我的问题是,当更新值时,缓存检查应该通知哪些侦听器所需的时间是O(n(操作,集群中的节点越多,性能就不会提高。这意味着我无法扩展集群来处理大量的密钥。

这可能是因为CacheNotifierImpl中经过所有侦听器的以下代码片段:

private CompletionStage<Void> doNotifyModified(K key, V value, Metadata metadata, V previousValue,
Metadata previousMetadata, boolean pre, InvocationContext ctx, FlagAffectedCommand command) {
if (clusteringDependentLogic.running().commitType(command, ctx, extractSegment(command, key), false).isLocal()
&& (command == null || !command.hasAnyFlag(FlagBitSets.PUT_FOR_STATE_TRANSFER))) {
EventImpl<K, V> e = EventImpl.createEvent(cache.wired(), CACHE_ENTRY_MODIFIED);
boolean isLocalNodePrimaryOwner = isLocalNodePrimaryOwner(key);
Object batchIdentifier = ctx.isInTxScope() ? null : Thread.currentThread();
try {
AggregateCompletionStage<Void> aggregateCompletionStage = null;
for (CacheEntryListenerInvocation<K, V> listener : cacheEntryModifiedListeners) {
// Need a wrapper per invocation since converter could modify the entry in it
configureEvent(listener, e, key, value, metadata, pre, ctx, command, previousValue, previousMetadata);
aggregateCompletionStage = composeStageIfNeeded(aggregateCompletionStage,
listener.invoke(new EventWrapper<>(key, e), isLocalNodePrimaryOwner));

其中CCD_ 2函数检查每个侦听器的过滤器以查看是否应该调用该函数。这意味着每个节点总是必须对每个事件的每个侦听器进行迭代,只是为了发现几乎所有的侦听器都没有操作。

是否有任何平滑的非O(n(方法来添加集群范围的侦听器,其中核心库确定侦听器只应针对特定密钥触发?

在使用infinispan-core库的版本13.0.0时发现了这种行为。

您可以提供一个过滤器,甚至是一个转换器,在发送到注册集群侦听器的节点之前应用于主节点。如果过滤器拒绝该事件,它将不会远程发送该事件,也不会通知侦听器。

所提供的转换器可用于更改发送给侦听器的值,这可能类似于从键或值中返回单个变量,而不是整个变量,从而可能减少有效负载大小。

https://infinispan.org/docs/stable/titles/developing/developing.html#event_filtering_and_conversion

请注意,这意味着当我们在节点之间运送过滤器和转换器时,您提供的过滤器和转换器必须由Infinispan进行编组。

最新更新