0
아파치 점화를 사용하여 선호도 컴퓨터 데이터 정렬을 수행 할 수 있습니다. 다음 두 예제에서는 예상대로 작동합니다.노드 당 캐시 된 데이터에서 작동
// 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' 이벤트를 수신하고 그에 따라 반응 할 수 있습니다. –