【问题标题】:Hazelcast Distributed Executor Service KeyOwnerHazelcast 分布式执行器服务 KeyOwner
【发布时间】:2013-11-09 07:06:26
【问题描述】:

我无法理解 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
你们有没有人在过去弄清楚它想要什么键?

【问题讨论】:

    标签: java key execution hazelcast owner


    【解决方案1】:

    也许我可以通过代码示例更好地解释它:

       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”的成员。因此,任务将被发送到存储两个映射条目的同一台机器上。

    我还没有查看您关于支持的讨论;这是对您在此处发布的关于堆栈溢出的原始问题的回答。

    【讨论】:

      【解决方案2】:

      在 Hazelcast 中,您可以对数据进行分区,并且在地图中使用密钥。

      例如当我有 2 个使用相同键的映射时,该键的映射条目将被放置在同一分区中的两个映射中。

      所以使用哪张地图并不是很重要。

      您可以使用执行器向拥有该分区的成员发送任务。

      我希望这能回答您的问题,否则请随时询问更多信息。

      【讨论】:

      • 这绝对是零意义。好吧,至少我看到了这种行为的优势。昨天与 Hazelcast Support 讨论了这个问题,我的问题的解决方案就出来了。我将不得不使用单独的 IMap 来存储 hazelcast 实例的 Id,该实例具有我正在寻找的 objectId 的对象。这样我就可以执行OnMember(HazelcastInstance.getMembers().get(id))。
      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2017-01-12
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多