Сервис распределенных исполнителей 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 карты, использующие один и тот же ключ, запись для этого ключа будет размещена для обеих карт в одном разделе.
Так что не очень важно, какая карта используется.
Вы можете использовать исполнителя, чтобы отправить задачу члену, владеющему этим разделом.
Я надеюсь, что это отвечает на ваш вопрос, в противном случае не стесняйтесь спрашивать дополнительную информацию.