Apache Ignite 中慢事件监听器的工作

Slow event listener's work in Apache Ignite

我写了一些运行 Ignite 服务器节点并附加到它的 EventListener 的代码。然后我将 10 个元素放入缓存中,并为每个元素记录了放置元素和捕获有关其创建的事件之间的时间差。

当我创建一个服务器节点并将 10 个元素放入 IgniteCache 时,我得到了很好的结果。对于 10 个元素,它是(以毫秒为单位的时间差异):

ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 51 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 2 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 1 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 1 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 1 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 2 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差listener - 2 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 2 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 2 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 1

我加一个节点的结果是一样的(拓扑快照变成:[ver=2, servers=2, clients=0, CPUs=4, heap=3.6 GB]).

但是当我将 setBackups(1) 应用于 IgniteCache 时,结果变得很奇怪:

ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 573 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 573 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 570 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 571 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 571 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 571 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差listener - 571 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 561 ruslangm.sample.ignite.listener.EventListener - put 和 listener 之间的时间差 - 560

我创建 IgniteCache 并附加到它的事件侦听器的代码非常简单:

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

在我的监听器中,我只打印这条消息:

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

大家可以上github看看,真的就是这么简单

我的问题是:我做错了什么吗?或者 Ignite 在使用现有备份监听事件时真的很慢吗?

它太慢的原因在于 query.setLocal(true) 调用。我只想从位于同一台机器上的服务器节点接收事件,但这不是提高性能的最佳方式。

我添加了 RemoteFilter 并将实现更改为:

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

一切都变得完美。