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

标签 java ignite in-memory-database gridgain

我写了一些代码来运行 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 - 放置和监听器之间的时间差异 - 2 ruslangm.sample.ignite.listener.EventListener - 放置和监听器之间的时间差异 - 2 ruslangm.sample.ignite.listener.EventListener - 放置和监听器之间的时间差异 - 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.6GB])。

但是当我将 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 - 放置和监听器之间的时间差异 - 571 ruslangm.sample.ignite.listener.EventListener - 放置和监听器之间的时间差异 - 571 ruslangm.sample.ignite.listener.EventListener - 放置和监听器之间的时间差异 - 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()); 
               } 
            }; 
        } 
    }); 

一切都变得完美。

关于java - Apache Ignite 中慢事件监听器的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48712101/

相关文章:

java - 使用spring data jpa点燃使用语法IN

kubernetes - 无法检索 Ignite pods IP 地址

erlang - 为什么大公司使用 Mnesia 而不是使用 Riak 或 CouchDB

database - 在将自身保存到磁盘的内存 key 存储中?

java - 您是否成功地使用了 Spring 和 Hibernate Web 应用程序

java - 单击 JButton 显示图像

Java Applet 未加载 - 客户端/服务器

java - 更改密码以在 Apache Ignite 中连接服务器

database - 我什么时候应该考虑使用内存数据库以及需要注意的问题是什么?

java - Android - 检查 Activity 是否是第一次打开