0
我能夠使用apache點火來實現親和性計算機數據配置。在以下兩個示例中,它按預期工作。對每個節點的緩存數據進行操作
// 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));
});
但是,我想對所有的節點數據運行lambda。比如說,我已經緩存了每個人,他們所有的來自亞馬遜的訂單。我想知道每個人的訂單總金額是多少。
我可能只是想念一個例子,但根據文檔我看不到如何做到這一點。在我見過的例子中,我必須指定我想要計算的鍵。在這個例子中,我只是希望能夠在所有節點上執行一些lambda,每個節點只在它自己的數據份額上運行。
我試着這樣做
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」事件並做出相應的反應。 –