2017-02-14 83 views
5

Я использую 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% времени (допустимо для моего варианта использования).

ответ

1

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

Итак, ответ «да, это будет работать».