0

特定のプロセスがグリッド内で 1 回だけ実行されるようにするための推奨されるアプローチは何ですか?

ユースケースは、グリッド全体でデータを更新するために、リモート ソースから単一の多重化ストリームを購読することです。サブスクライブするノードを選択し、そのノードに障害が発生したときにサブスクライブする新しいノードを選択する必要があります。

これに対して gridgain に事前に構築されたパターンはありますか?それとも、グリッド ライフサイクル イベントのリッスンと分散 CAS 操作の組み合わせによって解決されますか?

もう 1 つのユースケースは、失敗時に新しいノードに移行する、永続的に実行する必要があるシングルトン ジョブです。

ありがとう。

4

3 に答える 3

1

GridGain 6.2.0-rc2 リリース以降、GridGain にはリーダー選出のためのいくつかの方法があります。

  1. GridProjection.oldest()は、クラスター内の最も古いノードに対する動的な射影を返します。最も古いノードが何らかの理由でクラスターを離れた場合、次に古いノードが自動的に選択されるため、ユーザーは中断することなく最も古いノードを使用し続けることができます。
  2. GridGain は、グリッド内で制御されたサービス展開を行う機能を提供する DistributedServices 機能を追加しました。cluster-singleton-serviceper-node-singleton-service、または などのクールな機能がありますper-cache-key-singleton-service。これはそれ自体がリーダーの選出ではありませんが、たとえば GridGain はcluster-singleton-service、グリッドで利用できるサービスのインスタンスが常に 1 つだけであることを保証するため、リーダーの選出の必要性を完全に取り除く可能性があります。

分散サービスの詳細については、分散サービスのドキュメントを参照してください。

于 2014-07-13T00:12:59.433 に答える
0

クラスター内の最も古いノードを取得して、そのノードで操作を開始するだけです (Grid.nodes() はグリッド内のすべてのノードを返します)。また、他のノードで検出イベント リスナーをサブスクライブし、最も古いノードに障害が発生した場合に備えて、次に古いノードに引き継がせる必要があります。

ノードが最も古いノードかノードかを確認するには、GridNode.order() メソッドを使用できます。順序が最小のノードが最も古いノードになります。

検出イベントをリッスンするには、次のコードを使用できます。

        grid.events().localListen(new GridPredicate<GridEvent>() {
            @Override public boolean apply(GridEvent event) {
                System.out.println("Event: " + event.name());

                return true;
            }
        }, GridEventType.EVTS_DISCOVERY);
于 2014-05-02T01:30:16.727 に答える
0

以下のコードを確認してください。GridGain 6.1.8 を使用してテストしました。

import org.gridgain.grid.*;
import org.gridgain.grid.cache.GridCache;
import org.gridgain.grid.cache.GridCacheConfiguration;
import org.gridgain.grid.cache.GridCacheMode;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;

public class GridGainMain {

    public static void main(String[] args) throws GridException {

        GridConfiguration config = new GridConfiguration();
        // Give a name to your grid.
        config.setGridName("MyCoolGrid");

        // Configure the cache that will be used by the leader election algorithm.
        GridCacheConfiguration leaderConf = new GridCacheConfiguration();
        leaderConf.setName("leader");
        leaderConf.setCacheMode(GridCacheMode.REPLICATED);

        config.setCacheConfiguration(leaderConf);

        // Start the grid!
        try (Grid grid = GridGain.start(config)) {

            // Get the local node.
            final GridNode localNode = grid.localNode();
            // Get the leader cache.
            final GridCache<String, String> leaderCache = grid.cache("leader");

            // Elect this member as the leader, if no other node was elected yet.
            putIfAbsent("leader", localNode.id().toString(), leaderCache);

            // ================================================
            // Schedule the leader election algorithm. 
            // The leader election algorithm will elect the oldest grid node as the leader.
            // ================================================
            new Timer().scheduleAtFixedRate(new TimerTask() {
                                                @Override
                                                public void run() {

                                                    // Get the self ID.
                                                    final String selfId = localNode.id().toString();
                                                    // Get the cached leader ID.
                                                    final String cachedLeaderId = get("leader", leaderCache);
                                                    // Get all nodes.
                                                    List<GridNode> list = new ArrayList<>(grid.nodes());
                                                    // Sort all nodes by natural order.
                                                    list.sort((o1, o2) -> (int) (o1.order() - o2.order()));
                                                    // Get the ID of the oldest node, which is the leader ID.
                                                    final String leaderId = list.get(0).id().toString();

                                                    // If the leader ID is not equals to the cached leader ID,
                                                    if (!leaderId.equals(cachedLeaderId)) {
                                                        // Put the leader ID into cache.
                                                        put("leader", leaderId, leaderCache);
                                                    }

                                                    // If this node is the leader,
                                                    if (selfId.equals(leaderId)) {
                                                        // =====================================
                                                        // Do something! Only this grid node will execute this code.
                                                        // =====================================
                                                    }

                                                    System.out.println("### Self ID: " + selfId
                                                            + ", Order: " + localNode.order()
                                                            + ", Leader ID: " + leaderId);
                                                }
                                            },
                    // Schedule now.
                    0L,
                    // Run the algorithm once every five seconds.
                    TimeUnit.SECONDS.toMillis(5));

            // Remove this in production.
            sleep(1, TimeUnit.DAYS);
        }
    }

    private static <T> T get(String key, GridCache<String, T> cache) {
        try {
            return cache.get(key);
        } catch (GridException e) {
            return null;
        }
    }

    private static <T> T putIfAbsent(String key, T value, GridCache<String, T> cache) {
        try {
            return cache.putIfAbsent(key, value);
        } catch (GridException e) {
            return null;
        }
    }

    private static <T> T put(String key, T value, GridCache<String, T> cache) {
        try {
            return cache.put(key, value);
        } catch (GridException e) {
            return null;
        }
    }

    public static void sleep(long duration, TimeUnit unit) {
        try {
            unit.sleep(duration);
        } catch (InterruptedException e) {
            // Ignore.
        }
    }

}
于 2014-06-28T15:30:37.687 に答える