点燃 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++ 和缓存关联的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis延迟加载和缓存

c++关联容器

C++关联容器知识总结

Apollo 中的缓存正在避免 GraphQL 解决多态关联

C++:关联、聚合和组合

c++基础——关联容器