首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >慢速事件侦听器在Apache中的工作

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

Stack Overflow用户
提问于 2018-02-09 18:35:09
回答 1查看 323关注 0票数 1

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

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

ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异- 51 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-2 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-1 ruslangm.sample.ignite.listener.EventListener与侦听器之间的时间差异-1 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-1 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-2 ruslangm.sample.ignite.listener.EventListener -时间差异在put和listener之间-2 ruslangm.sample.ignite.listener.EventListener - put与listener之间的时间差异-2 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-2 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异-1

当我添加一个节点时,结果是相同的(拓扑快照为: ver=2、servers=2、clients=0、CPUs=4、heap=3.6GB)。

,但当我将setBackups(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 - put与侦听器之间的时间差异- 571 ruslangm.sample.ignite.listener.EventListener - 571 ruslangm.sample.ignite.listener.EventListener - put与侦听器之间的时间差异- 571 ruslangm.sample.ignite.listener.EventListener -时间差异-时间差异在put和listener之间- 571 ruslangm.sample.ignite.listener.EventListener - put和listener之间的时间差异- 561 ruslangm.sample.ignite.listener.EventListener - put和listener之间的时间差异- 560

我创建IgniteCache并附加到它的代码非常简单:

代码语言:javascript
复制
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);

在我的听众中,我只需打印一条消息:

代码语言:javascript
复制
ruslangm.sample.ignite.listener.EventListener - Time diff between put and listener 

您可以在github上查看它,它非常简单。

我的问题是:我做错什么了吗?还是Ignite在使用现有备份侦听事件方面真的很慢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-12 15:44:46

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

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

代码语言:javascript
复制
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()); 
               } 
            }; 
        } 
    }); 

一切都变得完美了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48712101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档