【问题标题】:Zookeeper missed events on successive changesZookeeper 错过了连续更改的事件
【发布时间】:2016-12-12 21:11:54
【问题描述】:

我目前有一个带有单个 zookeeper 节点和 Curator 的设置来访问数据。通过 Curator TreeCache 读取数据。

我有以下测试:

public void test_callback_successive_changes_success_global_new_version() throws InterruptedException {

    ZookeeperTestsHelper.createNewNodeInZookeeperSingleCommand("/my/path/new_node", "some string4", curator);
    ZookeeperTestsHelper.createNewNodeInZookeeperSingleCommand("/my/path/new_node", "some string5", curator);

    Thread.sleep(1000);
    assertThat(<check what events the listener heard>);
}

请注意,在执行测试之前“new_node”不存在。

    public static void createNewNodeInZookeeperSingleCommand(final String fullPathOfValueInZookeeper, final String valueToSet, final CuratorFramework curator) {
    try {
        if (curator.checkExists().forPath(fullPathOfValueInZookeeper) != null) {
            System.out.println("E: " + valueToSet);
            //Node already exists just set it
            curator.setData().forPath(fullPathOfValueInZookeeper, valueToSet.getBytes());
        } else {
            System.out.println("N: " + valueToSet);
            //Node needs to be created
            curator.create().creatingParentsIfNeeded().forPath(fullPathOfValueInZookeeper, valueToSet.getBytes());
        }
    } catch (Exception e) {
        throw new IllegalStateException("Error", e);
    }
}

我希望缓存侦听器首先听到添加了“某些字符串 4”的节点的事件,然后听到另一个使用“某些字符串 5”更新的节点事件。

相反,我只接收添加了值“some string 5”的节点的事件

查看日志,两个命令都在执行。即“N: some string 4”和“E: some string 5”都被记录下来。 Zookeeper 中的最终值是正确的(“some string 5”),但我不明白为什么 Curator 缓存只看到一个事件?

【问题讨论】:

    标签: java apache-zookeeper apache-curator


    【解决方案1】:

    ZooKeeper(或 Curator 的 TreeCache)不保证您不会错过连续更改的事件。保证您不会看到与其他客户看到的顺序不同的连续更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多