提问者:小点点

慢速事件侦听器在Apache Ignite中的工作


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

当我创建一个服务器节点并在IgniteCache中放置10个元素时,我得到了很好的结果。对于10种元素,时间差为(毫秒):

ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-51ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-2ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-1ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-1ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-1ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-2ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-2ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-2ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-2ruslangm.sample.ignite.listener.事件侦听器-放置和侦听器之间的时间差异-1

当我添加一个节点时,结果是相同的(拓扑快照变为:[ver=2,server=2,client=0,CPU=4,heap=3.6GB])。

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

ruslangm.sample.ignite.listener.EventListener - put 和侦听器之间的时间差异 - 573 ruslangm.sample.ignite.listener.EventListener - put 和侦听器之间的时间差异 - 573 ruslangm.sample.ignite.listener.EventListener - put 和侦听器之间的时间差异 - 570 ruslangm.sample.ignite.listener.EventListener - 放置和侦听器之间的时间差异 - 571 ruslangm.sample.ignite.listener.EventListener - 放置和侦听器之间的时间差异 - 571 ruslangm.sample.ignite.listener.EventListener - 时间 放置和侦听器之间的差异 - 571 ruslangm.sample.ignite.listener.EventListener - put 和侦听器之间的时间差异 - 571 ruslangm.sample.ignite.listener.EventListener - 放置和侦听器之间的时间差异 - 561 ruslangm.sample.ignite.listener.EventListener - 放置和侦听器之间的时间差 - 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在监听现有备份的事件方面真的很慢?


共1个答案

匿名用户

速度太慢的原因在于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()); 
               } 
            }; 
        } 
    }); 

一切都变得完美了。