Я могу сделать сродство компьютерных данных коллокацией с apache ignite. В следующих двух примерах он работает так, как ожидалось.Работает на кэшированных данных на узел
// Works on all nodes
IgniteUtil.getIgnite().compute().broadcast(() -> {
System.out.println("Should happen on all nodes");
cache.get(key).forEach(x -> {
System.out.println(x);
});
});
// Works on just the one node
IgniteUtil.getIgnite().compute().affinityRun(IgniteUtil.CACHE_NAME, key ,() -> {
System.out.println("Should only happen on one node");
cache.get(key).forEach(x -> System.out.println(x));
});
Однако, я хочу запустить лямбда против всех данных узлов. Так, например, скажем, я кэшировал Для каждого человека все их приказы из Амазонки. Я хочу знать, что такое сумма доллара для всех заказов.
Возможно, мне просто не хватает примера, но, согласно документам, я не вижу, как это сделать. В примерах, которые я видел, я должен указать ключи, которые я хочу вычислить. В этом примере я просто хочу иметь возможность делать лямбда на всех узлах, причем каждый узел работает только на собственной доле данных.
Я попытался сделать это
IgniteUtil.getIgnite().compute().affinityRun(IgniteUtil.CACHE_NAME, key ,() -> {
System.out.println("Should only happen once per node");
List<Integer> count = new ArrayList<Integer>();
System.out.println("Size: " + Sets.newHashSet(cache.iterator()).size());
cache.iterator().forEachRemaining(x -> {count.add(count.size());});
System.out.println("Calculated Size: " + count.size());
System.out.println("Values: ");
cache.get(key).forEach(x -> System.out.print(x));
System.out.println();
});
и это выполнить только на узле, который имеет ключ, однако, размер кэша полного размера кэша, а не только те ценности, которые являются локальными.
Любые предложения?
Опять же, спасибо! Еще одно продолжение, если бы я хотел сделать это с ошибкой, есть ли встроенный механизм для этого? Или мне нужно будет что-то реализовать, чтобы обнаружить, когда узел опускается и настраивается? –
Да, вам придется корректировать, если топология изменяется в середине исполнения. Вы можете прослушивать события EVT_NODE_LEFT и EVT_NODE_FAILED и реагировать соответственно. –