我编写了一些运行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在监听现有备份的事件方面真的很慢?
速度太慢的原因在于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());
}
};
}
});
一切都变得完美了。