Search code examples
javaignitein-memory-databasegridgain

Slow event listener's work in Apache Ignite


I wrote some code that runs Ignite server node and attaches to it EventListener. Then I put 10 elements in cache and for each element recorded a time delta between putting element and catching event about it's creation.

When I created one server node and put 10 elements in IgniteCache I've got good results. For 10 elements it was (time diff in millis):

ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 51 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 2 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 1 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 1 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 1 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 2 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 2 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 2 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 2 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 1

The results were the same when I added one node (Topology snapshot became: [ver=2, servers=2, clients=0, CPUs=4, heap=3.6GB]).

But when i applied setBackups(1) to IgniteCache the results became weird:

ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 573 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 573 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 570 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 571 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 571 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 571 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 571 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 561 ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener - 560

My code for creating an IgniteCache and attaching to it event listener is very simple:

Ignite ignite = Ignition.start("ignite.xml"))
CacheConfiguration<String, Long> cfg = new CacheConfiguration<>();
cfg.setCacheMode(CacheMode.PARTITIONED);
cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
cfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_ASYNC);
cfg.setName("myCache");
cfg.setBackups(1);
IgniteCache<String, Long> cache = ignite.getOrCreateCache(cfg);

ContinuousQuery<String, Long> query = new ContinuousQuery<>();
query.setLocalListener(new EventListener());
query.setLocal(true);
QueryCursor<Cache.Entry<String, Long>> cursor = cache.query(query);

In my listener I just print this message:

ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener 

You can look at it on github, it is really so simple.

My question is: am I doing something wrong? Or Ignite is really so slow in listening events with existing backups?


Solution

  • The reason because it was so slow was in query.setLocal(true) invocation. I wanted to receive events only from server nodes located on the same machine but it's not the best way for your performance.

    I added RemoteFilter and changed realization to:

    final Set<ClusterNode> nodes = new HashSet<>(ignite.cluster().forDataNodes("myCache") 
                    .forHost(ignite.cluster().localNode()).nodes()); 
    
    qry.setRemoteFilterFactory(new Factory<CacheEntryEventFilter<String, Long>() { 
            @Override 
            public CacheEntryEventFilter<String, Long> create() { 
               return new CacheEntryEventFilter<String, Long>() { 
                   @Override 
                   public boolean evaluate( 
                        CacheEntryEvent<? extends String, ? extends Long> event) throws CacheEntryListenerException { 
                        return nodes.contains(ignite.cluster().localNode()); 
                   } 
                }; 
            } 
        }); 
    

    And everything became perfect.