使用多线程系统在Zookeeper上监视多个节点

时间:2019-06-23 09:14:29

标签: java apache-zookeeper apache-curator

我有一个项目,我在几个不同的线程中观察几个节点。现在,我注意到,当我监视一个节点并更改它并引发一个事件时,某个节点(例如称为A)上的监视会阻止所有其他监视者。因此,只有在A上的观察者完成之后,其他观察者才会返回以观察节点的更改。这意味着,如果节点的观察者被阻止时更改了节点(例如,称为B),则只有在A的​​观察者完成之后,节点B的观察者才会引发事件。

此问题导致应用程序变慢。

因此,为了解决这个问题,我想为每个线程使用不同的客户端连接(使用策展人),但是我已经读到一个连接就足够了,如果我需要多个连接,则可以进行一些连接我的实现感到厌倦。

1)我不了解与Zookeeper服务器的多重连接有什么问题

2)我的问题还有其他解决方法吗?

编辑-有关该问题的更多具体信息

我有一个主服务器,可以接收来自客户端的请求(每个客户端都可以将文件保存在我的服务器上,并且我们对该文件进行一些处理,它比听起来复杂得多,我将不做详细介绍),并且主服务器会创建一个/ tasks /中的节点供工作人员处理文件(当然,没有数据,数据在db中)。当工作人员监视其节点时,他将处理该文件,并在完成时在/ status中创建一个节点(该节点具有其处理已完成的所有文件)。 主节点监视节点/ status,并在更改某些内容时获取子节点,并创建一个线程(以使速度更快,因为zookeeper监视程序和回调是单线程的),该线程将释放这些文件(删除一些元从数据库中返回响应给客户端,删除一些变量等)。

这是主要流程之一,但是代码的另一个重要部分是侦听节点,并在发生更改时处理其子节点。

因为这个东西在线程中,所以我创建了一个已经完成的节点的列表,所以我不会重复进行最后的过程,但是它比那更复杂,并且该解决方案还导致了其他问题,有些并发错误。

所以我问

1)对于每个重要流程,多重连接有什么问题,因此我不必在watch和callback中创建线程?

2)我可以在这里使用其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

它没有充分的文档记录,但是ZooKeeper有一个用于处理观察者和异步回调的线程。我们为此向馆长撰写了技术说明。 https://cwiki.apache.org/confluence/display/CURATOR/TN1