Я использую 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% времени (приемлемо для моего варианта использования).
Если ваши значения сериализованы должным образом на стороне C ++ и могут быть доступны из Java (вы можете проверить это с помощью Put
на С ++ и Get
на яве) тогда affinityRun
будет делать именно то, что должен — он выполнит задачу на основном узле для предоставленного ключа.
Так что ответ «да, это сработает».
Других решений пока нет …