【问题标题】:barrier for multiple nodes多个节点的屏障
【发布时间】:2015-11-06 14:32:24
【问题描述】:

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

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

是否有一个简单的框架可以让我在 Scala 中做到这一点?

【问题讨论】:

  • 正态分布的协调是通过 zookeeper 或 etcd 等服务完成的。例如,在 zookeeper 中,您可以为某些数据路径设置watch,这样一旦您向其写入“start”,所有节点都会收到通知并可以继续执行操作。但如果这种障碍是协调的唯一用途,我认为这将是过度设计,有人可能会提出替代的更简单的解决方案(例如广播)
  • 如果您决定使用 ZooKeeper,那么我可以推荐 Apache Curator 的食谱 (curator.apache.org/curator-recipes/index.html)。他们为您面临的大多数问题提供了许多预先准备好的解决方案。例如,他们也有一个屏障配方。
  • @om-nom-nom,我不认为这是过度工程,通过简单的广播我不确定是否每个预期的接收器都准备好接收。 (虽然“广播”这个简单的术语相当重,所以我不确定你的意思。)

标签: scala distributed barrier


【解决方案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();
        }   
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2018-02-01
    • 2015-12-05
    • 2013-06-16
    相关资源
    最近更新 更多