Дополните каждое существующее значение в кэше данными из другого кэша в кластере Ignite - PullRequest
0 голосов
/ 07 сентября 2018

Каков наилучший способ обновления поля каждого существующего значения в кэше Ignite данными из другого кэша в том же кластере наиболее быстрым способом (десятки миллионов записей по килобайту каждая)?

Псевдокод:

try (mappings = getCache("mappings")) {
    try (entities = getCache("entities")) {
        entities.foreach((key, entity) -> entity.setInternalId(mappings.getValue(entity.getExternalId());
    }
}

1 Ответ

0 голосов
/ 08 сентября 2018

Я бы посоветовал использовать вычисления и отправить закрытие для всех узлов в топологии кэша. Затем на каждом узле вы должны выполнить локальный первичный набор и выполнить обновления. Даже при таком подходе вам все равно лучше собирать обновления и выпускать их с помощью вызова putAll (или, возможно, использовать IgniteDataStreamer).

ПРИМЕЧАНИЕ: для приведенного ниже примера важно, чтобы ключи в кэшах «сопоставлений» и «сущностей» были либо идентичными, либо совмещенными. Более подробная информация о размещении здесь: https://apacheignite.readme.io/docs/affinity-collocation

Псевдокод будет выглядеть примерно так:

ClusterGroup cacheNodes = ignite.cluster().forCache("mappings");

IgniteCompute compute = ignite.compute(cacheNodes.nodes());

compute.broadcast(() -> {
    IgniteCache<> mappings = getCache("mappings");
    IgniteCache<> entities = getCache("entities");

    // Iterate over local primary entries.
    entities.localEntries(CachePeekMode.PRIMARY).forEach((entry) -> {
       V1 mappingVal = mappings.get(entry.getKey());
       V2 entityVal = entry.getValue();

       V2 newEntityVal = // do enrichment;

       // It would be better to create a batch, and then call putAll(...)
       // Using simple put call for simplicity.
       entities.put(entry.getKey(), newEntityVal);
    }
});
...