Ява — Cgn и Cache Affinity

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

5

Решение

Если ваши значения сериализованы должным образом на стороне C ++ и могут быть доступны из Java (вы можете проверить это с помощью Put на С ++ и Get на яве) тогда affinityRun будет делать именно то, что должен — он выполнит задачу на основном узле для предоставленного ключа.

Так что ответ «да, это сработает».

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]