Сервис распределенных исполнителей Hazelcast KeyOwner

У меня проблемы с пониманием концепции распределенного выполнения Hazelcast. Говорят, что он может выполнять выполнение на экземпляре владельца определенного ключа.
Из документации:

   <T> Future<T> submitToKeyOwner(Callable<T> task, Object key)
   Submits task to owner of the specified key and returns a Future representing that task.
       Parameters:
            task - task
            key - key
       Returns:
            a Future representing pending completion of the task

Я полагаю, что я не одинок, чтобы создать кластер с несколькими картами, которые могли бы фактически использовать один и тот же ключ для разных целей и содержать разные объекты (например, что-то в следующей настройке):

IMap<String, ObjectTypeA> firstMap = HazelcastInstance.getMap("firstMap");
IMap<String, ObjectTypeA_AppendixClass> secondMap = HazelcastInstance.getMap("secondMap");

Мне кажется довольно запутанным, что документация говорит о владельце ключа. Мое настоящее разочарование состоит в том, что я не знаю, К КАКОЙ - на какой карте - ключ он относится?
Документация также дает "демонстрацию" этого подхода:

import com.hazelcast.core.Member;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.IExecutorService;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;   
import java.util.Set;
import com.hazelcast.config.Config;

public void echoOnTheMemberOwningTheKey(String input, Object key) throws Exception {
   Callable<String> task = new Echo(input);
   HazelcastInstance hz = Hazelcast.newHazelcastInstance();
   IExecutorService executorService = hz.getExecutorService("default");
   Future<String> future = executorService.submitToKeyOwner(task, key);
   String echoResult = future.get();
}

Вот ссылка на сайт документации: Hazelcast MultiHTML Documentation 3.0 - Распределенное выполнение
Кто-нибудь из вас, ребята, выяснил в прошлом, какой ключ он хочет?

2 ответа

Решение

Возможно, я могу объяснить это лучше на примере кода:

   Callable<String> task = new Echo(input);

   String key = "foo";
   IMap map1 = hz.getMap("m1");
   IMap map2 = hz.getMap("m2");
   map1.put(key,1);
   map2.put(key,2);

   IExecutorService executorService = hz.getExecutorService("default");
   Future<String> future = executorService.submitToKeyOwner(task, key);
   String echoResult = future.get();

Как вы можете видеть, есть 2 карты, map1 и map2.

Обе эти карты имеют запись карты с одинаковым ключом 'foo', но разными значениями.

Но эти 2 записи карты окажутся в одном разделе (то есть в одном и том же элементе), потому что ключ используется для определения раздела.

В последних нескольких строках задача отправляется владельцу ключа, в этом случае мы собираемся отправить задачу участнику, которому принадлежит ключ 'foo'. Таким образом, задача будет отправлена ​​на тот же компьютер, на котором хранятся обе записи карты.

Я не проверил вашу дискуссию о поддержке; это ответ на ваш первоначальный вопрос, который вы разместили здесь по поводу переполнения стека.

В Hazelcast вы можете разделить свои данные, и на карте используется ключ.

Например, когда у меня есть 2 карты, использующие один и тот же ключ, запись для этого ключа будет размещена для обеих карт в одном разделе.

Так что не очень важно, какая карта используется.

Вы можете использовать исполнителя, чтобы отправить задачу члену, владеющему этим разделом.

Я надеюсь, что это отвечает на ваш вопрос, в противном случае не стесняйтесь спрашивать дополнительную информацию.

Другие вопросы по тегам