我遇到了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条目处理器。
任何帮助将不胜感激!
答案 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)不能 处理。考虑到这一点,最好是进入 处理器执行尽可能快。