Обновления Hazelcast Delta - PullRequest
0 голосов
/ 20 мая 2019

Я ищу способ сделать дельта-обновления в Hazelcast для большого набора данных (1 миллион + записей)

Вариант использования: карта объектов задается клиентом Hazelcast, в пределах значений карты заполняются только определенные поля, а остальные являются нулевыми. Мы хотим заменить поля для записи, если они изменены, но если они нулевые или одинаковые, изменений не произойдет.

В настоящее время мы делаем это с помощью процессора ввода, но я считаю, что карта, которую мы передаем в конструктор, будет отправлена ​​каждому члену кластера, что неэффективно. Есть ли лучший способ сделать это?

private Map mapOfNewValues;

public DomainClassDeltaUpdateEntryProcessor(Map mapOfNewValues) {
  this.mapOfNewValues = mapOfNewValues;
}

@Override
public Object process(Map.Entry<String, DomainClass> entry) {
  DomainClass oldDomain = entry.getValue();
  if (oldDomain != null) {
    DomainClass newDomainObj = (DomainClass) map.get(entry.getKey());
    if (newDomainObj != null) {
      entry.setValue(getDelta(oldDomain,newDomainObj));
    }
  }
  return null;
}

Вызывается с помощью

 map.executeOnKeys(deltaMap.keySet(), new DomainClassDeltaUpdateEntryProcessor(deltaMap));

1 Ответ

1 голос
/ 21 мая 2019

Вы можете посмотреть на стороне клиента и использовать executeOnKey. Таким образом, вы можете отправить обновление для каждого кета отдельным вызовом, поэтому, если у вас есть 1000 ключей на картах и ​​4 участниках, вместо отправки всех 1000 обновлений всем 4 участникам, вы отправляете только 100 обновлений, распределенных между 4 участниками и каждым вызов будет содержать только 1 дельта-объект

Итак, на стороне клиента вы можете сделать что-то вроде этого:

mapOfNewValues.entrySet().forEach(e -> if(e.getValue() != null) map.executeOnKey(e.getKey(), new DomainClassDeltaUpdateEntryProcessor(e.getValue())));

...