Как качественно добавить объекты в распределенную очередь в Hazelcast? - PullRequest
1 голос
/ 15 июня 2019

Добавление элементов в распределенную очередь в Hazelcast происходит невероятно медленно (читай: 66 элементов / сек; это нормально?), Когда очередь хранится на узле, отличном от того, где выполняется код (и установлен на 0 в конфиге для этой очереди). Есть ли способ добавить элементы из узла владельца? Есть ли что-то принципиально неправильное в моем подходе с использованием Hazelcast?

Эта операция занимает около 15 секунд:

public static void main(String[] args) throws ExecutionException {
    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
    IQueue<String> configs = hazelcastInstance.getQueue("configs");  
    for(int i = 0; i<1000;i++) {
        configs.add("Some string"+i);
    }
}

Изменение значений и конфигурации (см. Ниже) не влияет на скорость выполнения. Я бы предположил, что увеличение блокирует операции вставки, а увеличение - нет (на самом деле цикл должен выполняться так же быстро, как если бы операция #add находилась в локальной очереди). Однако время выполнения цикла for одинаково. Даже если я установлю оба значения в 0. Я что-то упустил?

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast xsi:schemaLocation=
  "http://www.hazelcast.com/schema/config hazelcast-config-3.7.xsd"
  xmlns="http://www.hazelcast.com/schema/config"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <network>
        <port auto-increment="true" port-count="20">5701</port>
        <join>
            <multicast enabled="false">
        </multicast>
        <tcp-ip enabled="true">
            <member>172.105.66.xx</member> 
        </tcp-ip>
        </join>
    </network>

    <queue name="configs">
        <statistics-enabled>false</statistics-enabled>
        <max-size>0</max-size>
        <backup-count>0</backup-count>
        <async-backup-count>1</async-backup-count>
        <empty-queue-ttl>-1</empty-queue-ttl>
    </queue>
</hazelcast>

1 Ответ

2 голосов
/ 15 июня 2019

Есть несколько способов оптимизировать очередь.Очередь может хранить ваши записи в двоичном или в виде объекта.Сверху вы можете определить количество резервных копий, чем больше резервных копий, тем медленнее будет.Число реплицируемых резервных копий по умолчанию равно 1. Это означает, что для каждого пула у вас будет одна репликация, кроме пут.Вероятно, вещь, которая увеличивает производительность больше всего при использовании двоичной формы хранения записей, это сериализация.Сериализация Java очень медленная.Вместо этого используйте DataSerializeable или IdentifiedDataserializeable.

Чтобы проверить задержку сети для некоторых медленных сетей, вам потребуется aso, у вас будет задержка 1-2MS только для сетевого соединения для 1000 вставок, это будет 1000 - 2000 мс, что составляет 1-2ожидание только второй сети.

Для пакетных операций можно выполнять вставки в параллельном режиме, если порядок вставок не имеет значения.

И в очереди могут быть асинхронные резервные копии, которые снова немного повысят производительность.

ОБНОВЛЕНИЕ: при нормальном запуске приложения у вас редко будет один сценарий с тематикой.Поэтому вместо того, чтобы вставлять эти 1000 значений одно за другим, выполните следующее:
List arrayList = new ArrayList ();

for(int i=0;i<1000;++i) {
   arrayList.add("myString " + i);
}

arrayList.paralelstream().forEach(t->configs.put(t));

Теперь вы вставляете в paralel.

...