I am using Apache Ignite 1.8.0 for caching on a cluster. I am using the C++ API and am accessing the same cache from both Java and C++. This works fine but I would like to also use affinity collocation to execute tasks on the same node that has cached the data. I am creating the cache in Java, putting the data in C++ but then want to run tasks in Java on this data. The C++ API doesn't have Affinity support so I am now wondering what my options are.
This is how I am creating the cache:
final IgniteCache<Integer, ByteArray> cache = ignite.createCache("myCacheBinaryCpp")
Then I put data from C++. I have a simple byte array class for testing purposes.
int8_t* byteArr= new int8_t[3];
byteArr[0] = 0;
byteArr[1] = 2;
byteArr[2] = 2;
cacheCppJ.Put(i, ByteArray(3,byteArr));
Now I would like to do something like the following but don't know how to ensure that my Java tasks will execute locally to the data.
final Integer affKey = new Integer(9);
ignite.compute().affinityRun("myCacheBinaryCpp", affKey, () -> {
cache.get(affKey);
System.out.println("Got cache with affinity");
});
The issue is that the key in C++ is just an int and there is no associated AffinityKey. Therefore I don't know if the affKey I created in Java will always run with the correct node affinity.
Is this the correct approach? I have also considered restricting each of my caches to a pair of nodes to ensure that all operations are on the correct node at least 50% of the time (acceptable me for my use case).
If your values serialized properly on the C++ side and can be reached from the Java (you can check it with Put
on C++ and Get
on Java) then affinityRun
will do exactly what it should - it will run task on the primary node for the provided key.
So the answer is "yes, this is going to work".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With