Как улучшить производительность метода Get, который читает данные из Hazelcast? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть следующий контроллер:

@GetMapping("/v1/quotes")
public List<MyQuote> getQuotes() {
    return hazelcastMap.values().stream()
            .map(r -> new Quote(r))
            .collect(Collectors.toList());
}

И это занимает примерно 330 мс, но у меня есть требование улучшить его, чтобы выполнить запрос за 100 мс или быстрее.

Есть идеи, как улучшить производительность?

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Общепринято, что потоки немного менее эффективны, чем в старой школе с итераторами и / или циклами.Но вряд ли вы получите улучшение на 300% от этого.Вы могли бы получить улучшение на 10 или 20% ... если бы вы преобразовывали обычную память Map.Для Hazelcast IMap накладные расходы на использование потоков по сравнению с оптимальным кодом будут незначительными.

(Это можно проверить с помощью профилирования и тщательного тестирования, характерного для вашего приложения.)


Я думаю, вам придется решить эту проблему при проектировании вашей системы или, возможно, с помощью настройки Hazelcast.

Некоторые проблемы с производительностью, с которыми вы сейчас работаете, связаны с IMap javadoc:

Collection<V> values()

Возвращает клон коллекции значений, содержащихся в этой карте.

Предупреждение: коллекция НЕ поддерживается картой, поэтому изменяется накарта НЕ отражается в коллекции, и наоборот.

Этот метод всегда выполняется распределенным запросом, поэтому он может вызвать QueryResultSizeExceededException, если настроено GroupProperty.QUERY_RESULT_SIZE_LIMIT.

Проблемы:

  • Когда вы вызываете values(), реализация IMap создает копиюзначения карты.Затем вы выполняете потоковую передачу из этой копии, а не непосредственно из IMap.

  • Операция values() выполняет распределенный запрос.Я подозреваю, что это неизбежно.В любом случае, это, вероятно, самая дорогая часть того, что вы делаете.

0 голосов
/ 24 марта 2019

Какую сериализацию вы используете? Все данные необходимо будет сериализовать, и это может оказать значительное влияние на производительность. Сериализация Java обычно является худшей с точки зрения пространства и времени. IdentifiedDataSerializable, как правило, лучше всего работает.

...