es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Escalabilidad de los Oyentes Agrupados en Infinispan para Caché con muchas Claves?

Cuando uso una caché incrustada en Infinispan, busco tener un oyente con filtrado en clúster que sea notificado cada vez que una clave específica se actualiza. Mi problema es que el tiempo que le lleva a la caché verificar qué oyentes deben ser notificados cuando se actualiza un valor es una operación O(n), sin ganancias de rendimiento con más nodos en mi clúster. Esto significa que no puedo escalar mi clúster para manejar grandes cantidades de claves.

Esto probablemente se debe al siguiente fragmento de código en CacheNotifierImpl que recorre todos los oyentes:

   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));

donde la función listener.invoke verifica el filtro de cada oyente para ver si la función debe invocarse o no. Esto significa que cada nodo siempre tendrá que iterar a través de cada oyente en cada evento, solo para descubrir que casi todos los oyentes no hacen nada.

¿Existe alguna forma sin O(n) de agregar un oyente en todo el clúster donde la biblioteca principal identifique que el oyente solo debe activarse para una clave específica?

Este comportamiento se ha encontrado al utilizar la versión 13.0.0 de la biblioteca infinispan-core.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en escalabilidad e Infinispan, aconsejaría que actualmente no existe una manera óptima no O(n) de agregar un listener a nivel de clúster que se active solo para una clave específica. La implementación actual en CacheNotifierImpl de Infinispan recorre todos los listeners para cada evento, lo cual es una operación O(n), y esto no resulta en mejoras de rendimiento incluso con más nodos en el clúster. Esto se debe a que cada nodo siempre tendrá que iterar a través de todos los listeners para cada evento, solo para descubrir que casi todos los listeners no hacen nada.

    Sin embargo, una posible solución podría ser utilizar el Distributed Executor Service (DES) de Infinispan, que permite a los usuarios ejecutar una tarea en paralelo en varios nodos del clúster. Esto se podría utilizar para filtrar los listeners y solo ejecutar aquellos relevantes para la clave específica en el nodo donde se encuentra la clave. De esta manera, se podría evitar la operación O(n) y mejorar el rendimiento.

    Otra opción podría ser personalizar la implementación de Infinispan y modificar el mecanismo de invocación del listener para evitar la operación O(n) al buscar listeners relevantes. Sin embargo, esto requeriría un esfuerzo significativo y experiencia en los detalles internos de Infinispan.

    También es importante tener en cuenta que el equipo de soporte de Infinispan siempre está disponible para brindar orientación y asesoramiento sobre este tipo de problemas, y se pueden contactar para obtener ayuda adicional.

Comments are closed.