gpt4 book ai didi

java - 使用 ZooKeeper 进行高效的独占锁,适用于不频繁的操作

转载 作者:行者123 更新时间:2023-11-30 05:18:45 24 4
gpt4 key购买 nike

我在多个服务器上部署了一个微服务,它有两个主要数据源:

  1. 持续(24/7/365)大量接收事件(100-1000 个事件/秒)

  2. 每天一次的操作,可能需要一些时间才能完成

我想以独占模式运行此每日一次处理:暂停事件处理,运行每日一次任务,然后恢复事件处理。我已经有办法正确启动每天一次的操作,但我仍然必须在 1 和 2 之间实现锁定以确保排他性。

我发现的大多数 ZooKeeper 配方都需要对每个处理的事件进行写入操作,例如读取锁定获取 InterProcessReadWriteLock或用 DistributedAtomicLong 计数器增加。由于每天一次的操作很少发生,因此每个事件的开销似乎很浪费。

是否有针对此类用例进行优化的 ZooKeeper/Curator 收据?

我考虑过遵循以下方法,但我不确定这是否是正确的方法(以及如何实现下面的第 2 点):

  1. 当每天一次的操作开始时,在 ZooKeeper 中创建新的 /exclusive 路径
  2. 等待所有飞行中事件完成
  3. 在处理事件之前,检查 /exclusive 是否存在。如果存在,请停止处理,直到删除 /exclusive 路径
  4. 当一天一次结束时,删除 /exclusive 路径

最佳答案

这个怎么样?

每个事件处理器必须:

  • 通过 InterProcessReadWriteLock 获取锁。
  • 使用NodeCache观察“信号”节点并监听该节点上的变化。当该节点存在时,表示为每日处理时间。当它不存在时,事件处理可以继续。
  • 当 NodeCache 显示信号节点已创建时,事件处理器必须释放其锁并等待信号节点被删除(再次通过监听 NodeCache)。
  • 当NodeCache显示信号节点已被删除时,事件处理器再次获取读锁并继续处理事件。

一旦设置完毕,在全部运行时就不再有额外的 ZooKeeper Activity 。

当每天一次的操作准备好运行时:

  • 它创建信号节点(作为临时节点)
  • 在事件处理器用于读锁的同一路径上获取写锁
  • 是否定期处理
  • 释放写锁
  • 删除信号节点

然而,这有一个巨大的警告,这就是 JVM 暂停时可能发生的情况。另请阅读此Tech Note对于重要的边缘情况。

关于java - 使用 ZooKeeper 进行高效的独占锁,适用于不频繁的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59901835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com