ruslangm
ruslangm

Reputation: 703

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?

Upvotes: 1

Views: 385

Answers (1)

ruslangm
ruslangm

Reputation: 703

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.

Upvotes: 3

Related Questions