点燃 C++ 和缓存关联
Posted
技术标签:
【中文标题】点燃 C++ 和缓存关联【英文标题】:Ignite C++ and Cache Affinity 【发布时间】:2017-07-03 10:42:50 【问题描述】:我正在使用 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% 的时间在正确的节点上(我的用例可以接受)。
【问题讨论】:
【参考方案1】:如果您的值在 C++ 端正确序列化并且可以从 Java 访问(您可以使用 C++ 上的 Put
和 Java 上的 Get
检查它)然后 affinityRun
将完全按照它应该做的 - 它会在主节点上为提供的密钥运行任务。
所以答案是“是的,这会奏效”。
【讨论】:
以上是关于点燃 C++ 和缓存关联的主要内容,如果未能解决你的问题,请参考以下文章