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