我正在使用Apache Ignite 1.8.0在群集上进行缓存。我正在使用C ++ API并从Java和C ++访问相同的缓存。这工作正常,但我还想使用关联性搭配来在已缓存数据的同一节点上执行任务。我在Java中创建缓存,将数据放在C ++中,但后来想在这个数据上用Java运行任务。 C ++ API没有Affinity支持,所以我现在想知道我的选择是什么。
这就是我创建缓存的方式:
final IgniteCache<Integer, ByteArray> cache = ignite.createCache("myCacheBinaryCpp")
然后我从C ++中提取数据。我有一个简单的字节数组类用于测试目的。
int8_t* byteArr= new int8_t[3];
byteArr[0] = 0;
byteArr[1] = 2;
byteArr[2] = 2;
cacheCppJ.Put(i, ByteArray(3,byteArr));
现在我想做类似以下的事情,但不知道如何确保我的Java任务将在本地执行数据。
final Integer affKey = new Integer(9);
ignite.compute().affinityRun("myCacheBinaryCpp", affKey, () -> {
cache.get(affKey);
System.out.println("Got cache with affinity");
});
问题是C ++中的键只是一个int而且没有关联的AffinityKey。因此,我不知道我在Java中创建的affKey是否始终以正确的节点关联运行。
这是正确的做法吗?我还考虑将每个缓存限制为一对节点,以确保所有操作至少在50%的时间内都在正确的节点上(我的用例可以接受)。
答案 0 :(得分:1)
如果您的值在C ++端正确序列化并且可以从Java访问(您可以在C ++上使用Put
并在Java上使用Get
进行检查),那么affinityRun
将完全正确它应该是什么 - 它将在主节点上为所提供的密钥运行任务。
所以答案是&#34;是的,这将起作用&#34;。