在hazelcast EntryProcessor流程方法调用

时间:2016-10-26 14:30:37

标签: caching hazelcast

我遇到了EntryProcessor的行为,对我来说似乎有点奇怪。

首先我在做什么。

我的任务是使用EntryProcessor从另一个缓存A的数据中填充缓存B.

缓存A可以包含100K到1M的条目。所以我别无选择,只能通过它从A数据条目创建B缓存密钥,并在这样的密钥上运行EntryProcessor来创建B缓存的条目。

我发现当我运行这样的循环并从A构建B缓存并多次调用EntryProcessor(数量等于缓存A中的条目数)时,总体持续时间会不时发生变化。

所以我开始在每个程序步骤中编写日志。有时,入口处理器在几个条目的执行之间暂停运行,请参阅log

16:47:17.773 ce23b7a [thread-7] AppendingProcessor process process; enter 
16:47:17.773 7d9a120 [thread-7] AppendingProcessor process process; exit 

Pause between two threads (invocation on different keys) is about 10ms (which   could give us 100s on 100k keys!) 

16:47:17.782 ce23b7a [thread-0] AppendingProcessor process process; enter 
16:47:17.782 7d9a120 [thread-0] AppendingProcessor process process; exit 

有时我们可以看到另一种行为,没有任何暂停或在不同条目上执行之间的暂停非常小。

14:38:42.685 ce23b7a [thread-0] AppendingProcessor process - process; enter 
14:38:42.685 7d9a120 [thread-0] AppendingProcessor process - process; exit 

14:38:42.686 ce23b7a [thread-1] AppendingProcessor process - process; enter 
14:38:42.686 7d9a120 [thread-1] AppendingProcessor process - process; exit 

14:38:42.686 ce23b7a [thread-6] AppendingProcessor process - process; enter 
14:38:42.686 7d9a120 [thread-6] AppendingProcessor process - process; exit 

我认为它可能与分区有关,所以它可能与我有多少分区以及entryprocessor是否与同一分区中的条目一起工作有关,但现在我不认为是这种情况。

有时当我运行代码时,它会在没有暂停的许多条目上工作,然后暂停(通常为10毫秒),然后再次工作而不会暂停

2016-10-25 18:23:34.486 [thread-2] AppendingProcessor - process.exit; partId = 114
....
about 500 entries processed in 1 ms
...
2016-10-25 18:23:34.486 [thread-3] AppendingProcessor - process.exit; partId = 115
....
about 250 entries processed in 1 ms
...
2016-10-25 18:23:34.487 [thread-3] AppendingProcessor - process.exit; partId = 115

我的问题是在EntryProcessor中处理条目之间暂停的原因是什么,特别是如果在每两次处理方法调用之间发生暂停的话。

因为这样10毫秒的暂停似乎不对,可能是这种情况?

由于NDA,我无法提供代码的真实示例,但我编写了代码示例,请参阅AddressMapBean#process方法 和适当的AddressBookProcessor条目处理器。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您是否从A读取并在处理器内部放入B?如果是这样,则存在死锁风险。看到: https://groups.google.com/forum/#!topic/hazelcast/27_6iS4oaSY 另见: https://github.com/hazelcast/hazelcast/issues/3146

另一个(可能)可能的原因可能是线程争用。来自文档:

  

注意:条目处理器通过专用的操作线程运行   特定分区。因此,使用长时间运行的Entry Processor   执行,其他分区操作,如map.put(key)不能   处理。考虑到这一点,最好是进入   处理器执行尽可能快。