我使用Apache Ignite 1.8.0在集群上进行缓存。我正在使用Java,并从C++和C++访问相同的缓存。这可以很好地工作,但我也想使用关联搭配在缓存数据的同一个节点上执行任务。我在Java语言中创建缓存,将数据放在C++中,然后想在Java语言中对这些数据运行任务。C++应用程序接口不支持亲和性,所以我现在想知道我的选项是什么。
这就是我创建缓存的方式:
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++中的键只是一个整数,并且没有关联的AffinityKey。因此,我不知道我用Java语言创建的affKey是否会始终以正确的节点亲和性运行。
这是正确的方法吗?我还考虑将我的每个缓存限制在一对节点上,以确保至少50%的时间所有操作都在正确的节点上(对于我的用例,可以接受我)。
发布于 2017-02-16 20:12:52
如果您的值在Java端被正确序列化,并且可以从Java端访问(您可以在C++上用Put检查它,在Java端用Get检查它),那么affinityRun将做它应该做的事情-它将在主节点上为提供的键运行task。
所以答案是“是的,这是可行的”。
https://stackoverflow.com/questions/42238071
复制相似问题