我试图在进程间通信中获得与屏障相同的功能,但现在用于分布式节点。
我的问题是我在节点上有多个分布式进程。它们有一些非确定性的设置,在设置之后我希望它们同时开始运行。
是否有一个简单的框架允许我在Scala中执行此操作?
答案 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();
}
}
请注意,屏障路径是"使用",对于群集的每个运行实例,您可能需要创建一些唯一的路径字符串。