我们有来自REST API的2百万个对象,每个API调用中有500个对象(总共750 MB数据)。
当我们将这些对象放入Hazelcast缓存中时,它需要 10分钟 - CPU为5-6% - 这是有道理的,因为有200万个阻止n / w调用
vertx.executeBlocking {
for(2 million times) {
hazelcast.put(mapName, key, value)
}
}
当我们不使用vertx的“executeblocking”而是执行以下操作时,整个过程在 10-15秒内完成,但CPU达到80%。我正在使用Hazelcast mancenter,所以我可以看到所有2百万个对象在10-15秒内反映在缓存中。
for(2 million times) {
hazelcast.putAsync(mapName, key, value)
}
当我们使用 #putAll 时, CPU达到60%,优于第二种方法。这种方法也在10秒内完成。
for(2 million objects in chunks of 500) {
hazelcast.putAll(mapName, collection-of-500-objects)
}
你们推荐的任何优化?我想知道为什么Hazelcast如此飙升CPU。
仅供参考 - 将 vertx.executeBlocking 视为异步执行一段代码。我们使用Intel Xeon 8 Core CPU和12GB RAM。
答案 0 :(得分:0)
看看IMap.putAll。它允许将数据放入块中。你说2mln除以500个对象一个块= 4k块
/**
* {@inheritDoc}
* <p>
* No atomicity guarantees are given. It could be that in case of failure
* some of the key/value-pairs get written, while others are not.
* </p>
* <p>
* <p><b>Warning:</b></p>
* If you have previously set a TTL for the key, the TTL remains unchanged and the entry will
* expire when the initial TTL has elapsed.
* </p>
*/
void putAll(Map<? extends K, ? extends V> m);
答案 1 :(得分:0)