【问题标题】:watch multiple nodes on zookeeper with multithreaded system使用多线程系统监视 Zookeeper 上的多个节点
【发布时间】: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


【解决方案1】:

没有很好的文档记录,但是 ZooKeeper 有一个单独的线程来处理观察者和异步回调。我们为 Curator 写了一篇关于它的技术说明。 https://cwiki.apache.org/confluence/display/CURATOR/TN1

【讨论】:

  • 我知道这个问题。我只想知道解决此问题的所有选项。我尝试在观察者内部使用线程,但它会导致其他问题。我想知道使用多个连接到 zookeeper 是否是一个好的解决方案?
  • 如果您描述了您正在尝试完成的工作,我可能会提供帮助。
  • 究竟如何?怎么联系你?
  • 这里描述一下
  • 我已经在问题中描述过了。我有几个观察者,在几个线程中,我不想让线程等待一个线程完成他的观察。当我在观察者内部使用线程时,它们只有一行(创建线程)并且速度更快,它会导致其他问题(因为我需要正确管理这些线程......)。
猜你喜欢
  • 2023-04-02
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2012-03-31
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多