【发布时间】:2019-06-23 09:14:29
【问题描述】:
我有一个项目,我在几个不同的线程中观察几个节点。现在,我注意到当我观察一个节点时,它发生了变化,并且引发了一个事件,某个节点(例如称为 A)上的观察会阻塞所有其他观察者。所以只有 A 上的 watcher 结束后,其他 watcher 才会返回来观察节点的变化。意思是,如果一个节点在其观察者被阻塞时发生变化(例如称为 B),只有在 A 上的观察者完成后,节点 B 上的观察者才会引发事件。
这个问题导致应用程序变慢。
所以,为了解决这个问题,我想为每个线程使用不同的客户端连接(使用 curator),但我已经读过一个连接就足够了,如果我需要多个连接,还有一些东西与我的实现一起磨损。
1) 我不明白多次连接到 Zookeeper 服务器有什么问题
2) 我的问题还有其他解决方案吗?
编辑 - 更具体地说明问题
我有一个从客户端获取请求的主机(每个客户端都可以将文件保存在我的服务器上,我们对这个文件进行一些处理,它比听起来更复杂,我不会详细说明),并且主机创建一个/tasks/ 中的节点,供工作人员处理文件(当然,没有数据,数据在数据库中)。当工作人员监视他的节点时,他会处理文件,当他完成时,他会在 /status 中创建一个节点(其中包含他们的进程已完成的所有文件)。 master 监视节点 /status ,当发生变化时,它会获取子节点,并创建一个线程(为了使一切更快,因为 zookeeper 观察者和回调是单线程的),这将释放这些文件(删除一些元从数据库,向客户端返回响应,删除一些变量等)。
这是主要流程之一,但我还有另一个重要的代码部分,它在节点上侦听,并在发生更改时处理它们的子节点。
因为这个东西在一个线程中,所以我创建了一个已经完成的节点列表,所以我不会多次执行最终过程,但它比这更复杂,并且该解决方案导致了其他问题,一些并发错误。
所以我问了
1) 对于每个重要的流程,多连接有什么问题,所以我不必在手表和回调中创建线程?
2) 我可以在这里使用其他解决方案吗?
【问题讨论】:
-
如果你不知道如何并行接收 ZK 事件,你可以把所有繁重的代码从监听器移到后台处理
-
@AdamSkywalker 我这样做了,但是我有几个线程,在同一个节点子节点上,我需要将它们与变量等同步,所以一个子节点不会被处理多次。它使代码更加复杂并导致错误。这就是为什么我想为每个观察者建立一个单一的连接(我没有很多观察者..)
标签: java apache-zookeeper apache-curator