У нас есть 2 миллиона объектов, поступающих из REST API кусками по 500 объектов в каждом вызове API (всего около 750 МБ данных).
Когда мы помещаем эти объекты в кеш Hazelcast, как показано ниже, это занимает около 10 минут — ЦП составляет 5-6% — это имеет смысл, поскольку есть 2 миллиона блокирующих вызовов n/w.
vertx.executeBlocking { for(2 million times) { hazelcast.put(mapName, key, value) } }
Когда мы не используем «блокировку выполнения» vertx, а делаем следующее, весь процесс завершается за 10-15 секунд, но ЦП достигает 80%. Я использую Hazelcast mancenter, поэтому я мог видеть, что все 2 миллиона объектов отражаются в кеше в течение 10-15 секунд.
for(2 million times) { hazelcast.putAsync(mapName, key, value) }
Когда мы использовали #putAll следующим образом, ЦП достигает 60%, что лучше, чем второй подход. Этот подход также заканчивается примерно за 10 секунд.
for(2 million objects in chunks of 500) { hazelcast.putAll(mapName, collection-of-500-objects) }
Любая оптимизация, которую вы, ребята, рекомендуете? Интересно, почему Hazelcast так сильно нагружает процессор?
К вашему сведению: считайте vertx.executeBlocking асинхронным выполнением фрагмента кода. Мы используем процессор Intel Xeon 8 Core с 12 ГБ оперативной памяти.
vertx.executeBlocking
технически не работает асинхронно, а позволяет безопасно выполнять синхронный код в vert.x, возвращая результаты асинхронному коду (работающему в вертикулах) по завершении. - person Arnold Schrijver   schedule 14.08.2017