4

Hazelcast Distributed Execution の概念を理解するのに問題があります。特定のキーの所有者インスタンスで実行できると言われています。
ドキュメントから:

   <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();
}

ドキュメンテーションサイトへのリンクは次のとおり
です。

4

2 に答える 2

4

おそらく、コード例でよりよく説明できます。

   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();

ご覧のとおり、map1 と map2 の 2 つのマップがあります。

これらのマップには両方とも、キー「foo」は同じで値が異なるマップ エントリがあります。

しかし、パーティションを決定するためにキーが使用されるため、これら 2 つのマップ エントリは同じパーティション (つまり、同じメンバー) になります。

最後の数行で、タスクはキーの所有者に送信されます。この場合、キー「foo」を所有するメンバーにタスクを送信します。したがって、タスクは、両方のマップ エントリが保存されているマシンと同じマシンに送信されます。

サポートに関するあなたの議論を確認していません。これは、スタック オーバーフローについてここに投稿した元の質問に対する回答です。

于 2013-11-01T08:57:48.030 に答える
0

Hazelcast ではデータを分割でき、マップではキーが使用されます。

たとえば、同じキーを使用する 2 つのマップがある場合、そのキーのマップ エントリは同じパーティション内の両方のマップに配置されます。

したがって、どのマップが使用されているかはあまり重要ではありません。

エグゼキューターを使用して、そのパーティションを所有するメンバーにタスクを送信できます。

これがあなたの質問に答えてくれることを願っています。それ以外の場合は、お気軽に詳細をお尋ねください。

于 2013-10-31T19:59:02.930 に答える