多个节点的障碍

时间:2015-08-13 14:40:10

标签: scala distributed barrier

我试图在进程间通信中获得与屏障相同的功能,但现在用于分布式节点。

我的问题是我在节点上有多个分布式进程。它们有一些非确定性的设置,在设置之后我希望它们同时开始运行。

是否有一个简单的框架允许我在Scala中执行此操作?

1 个答案:

答案 0 :(得分:1)

使用Curator框架,更具体地说,使用DistributedDoubleBarrier,您可以在每个需要同步的节点上设置障碍。这背后的原理是,您可以在继续之前设置需要进入屏障的节点数量。

假设您在example-zk:2128上有一个(普通)zookeeper实例,您可以在所有节点上使用以下构造:

package test.barrier;

//import
import org.apache.curator.*;
import org.apache.curator.framework.recipes.barriers.*;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.CuratorFramework;

class App {
        public App()
        {
                String zookeeperConnectionString = "example-zk:2181";
                String barrierPath = "/unique-string";

                RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
                CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
                client.start();

                DistributedDoubleBarrier distDBarrier = new DistributedDoubleBarrier(client, barrierPath, 3);

                try{
                        System.out.println("Waiting on barrier");
                        distDBarrier.enter();
                        System.out.println("Apparently everybody was aboard! Continuing ...");
                }
                catch(Exception e)
                {
                        System.out.println("O no!: " + e.getMessage());
                }


        }

        public static void main (String[] args){
                new App();
        }   
}

请注意,屏障路径是"使用",对于群集的每个运行实例,您可能需要创建一些唯一的路径字符串。