我对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 - Distributed Execution
你们有没有人在过去想出它想要的钥匙?
答案 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'但值不同。
但是这两个映射条目最终会在同一个分区中(因此在同一个成员上),因为密钥用于确定分区。
在最后几行中,任务被发送给密钥所有者,在这种情况下,我们将把任务发送给拥有密钥'foo'的成员。因此,任务将被发送到存储两个映射条目的同一台机器上。
我没有检查过您对支持的讨论;这是你在堆栈溢出时发布的原始问题的答案。
答案 1 :(得分:0)
在Hazelcast中,您可以对数据进行分区,并在地图中使用密钥。
E.g。当我有两个使用相同键的地图时,该键的地图条目将被放置在同一分区中的两个地图上。
因此,使用哪个地图并不是很重要。
您可以使用执行程序将任务发送给拥有该分区的成员。
我希望这能回答你的问题,否则请随时提出更多信息。