Reputation: 703
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
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