Ignite C++ 和缓存亲和性
Ignite C++ and Cache Affinity
我正在使用 Apache Ignite 1.8.0 在集群上进行缓存。我正在使用 C++ API 并从 Java 和 C++ 访问相同的缓存。这工作正常,但我还想使用亲和力搭配在缓存数据的同一节点上执行任务。我在 Java 中创建缓存,将数据放在 C++ 中,但随后想在 Java 中对该数据执行 运行 任务。 C++ API 没有 Affinity 支持,所以我现在想知道我的选择是什么。
这就是我创建缓存的方式:
final IgniteCache<Integer, ByteArray> cache = ignite.createCache("myCacheBinaryCpp")
然后我从 C++ 中输入数据。我有一个简单的字节数组 class 用于测试目的。
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% 的时间都在正确的节点上(我的用例可以接受)。
如果您的值在 C++ 端正确序列化并且可以从 Java 访问(您可以在 C++ 上使用 Put
并在 Java 上使用 Get
检查它) 然后 affinityRun
将完全按照它应该做的 - 它将 运行 在主节点上为提供的密钥执行任务。
所以答案是"yes, this is going to work"。
我正在使用 Apache Ignite 1.8.0 在集群上进行缓存。我正在使用 C++ API 并从 Java 和 C++ 访问相同的缓存。这工作正常,但我还想使用亲和力搭配在缓存数据的同一节点上执行任务。我在 Java 中创建缓存,将数据放在 C++ 中,但随后想在 Java 中对该数据执行 运行 任务。 C++ API 没有 Affinity 支持,所以我现在想知道我的选择是什么。
这就是我创建缓存的方式:
final IgniteCache<Integer, ByteArray> cache = ignite.createCache("myCacheBinaryCpp")
然后我从 C++ 中输入数据。我有一个简单的字节数组 class 用于测试目的。
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% 的时间都在正确的节点上(我的用例可以接受)。
如果您的值在 C++ 端正确序列化并且可以从 Java 访问(您可以在 C++ 上使用 Put
并在 Java 上使用 Get
检查它) 然后 affinityRun
将完全按照它应该做的 - 它将 运行 在主节点上为提供的密钥执行任务。
所以答案是"yes, this is going to work"。