Я использую Apache Ignite 1.8.0 для кэширования на кластере. Я использую C++ API и имею доступ к одному и тому же кэшу из Java и C++. Это отлично работает, но я хотел бы также использовать коллокацию affinity для выполнения задач на том же узле, который кэшировал данные. Я создаю кеш в Java, помещая данные на C++, но затем хочу запускать задачи в Java по этим данным. У C++ API нет поддержки Affinity, поэтому теперь я задаюсь вопросом, какие у меня варианты.Ignite C++ и Cache 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. Поэтому я не знаю, будет ли affKey, созданный мной на Java, всегда работать с правильной связностью узла.
Правильно ли это? Я также рассмотрел ограничение каждого из моих кэшей на пару узлов, чтобы гарантировать, что все операции находятся на правильном узле не менее 50% времени (допустимо для моего варианта использования).