Java Hbase原子读取和删除一行

Java Hbase原子读取和删除一行,java,hbase,apache-zookeeper,mutual-exclusion,Java,Hbase,Apache Zookeeper,Mutual Exclusion,我们使用hbase表作为一个大队列。许多客户机可以插入其中,许多客户机希望从中读取数据。问题是相互排斥。在span中,一个客户端读取数据直到将其删除,另一个客户端也可以读取数据!但我们希望确保每一行返回到一个且仅返回一个客户机 我应该提到我们正在使用JavaHBase客户端 有没有像在hbase中以原子方式获取并删除行或获取并更新这样的方法,或者其他方法可以处理这种情况 我发现了RowLock机制,但它已被弃用,不再存在。还有一个使用zookeeper的分发锁,但它似乎效率不高 提前谢谢 试试这

我们使用hbase表作为一个大队列。许多客户机可以插入其中,许多客户机希望从中读取数据。问题是相互排斥。在span中,一个客户端读取数据直到将其删除,另一个客户端也可以读取数据!但我们希望确保每一行返回到一个且仅返回一个客户机

我应该提到我们正在使用JavaHBase客户端

有没有像在hbase中以原子方式获取并删除行或获取并更新这样的方法,或者其他方法可以处理这种情况

我发现了RowLock机制,但它已被弃用,不再存在。还有一个使用zookeeper的分发锁,但它似乎效率不高

提前谢谢

试试这种方法

  • 获取所需的行。在java代码中检查它是否未被一个使用(特定列==0)
  • 检查行是否存在且未被任何人使用。如果是,则将其标记为(即,将列值从0增加到1)x。所有这些都可以通过checkAndPut完成
  • 使用checkAndDelete删除行

  • 这个主意很简单也很好。但我只是删除了第二步,但如果我能成功删除一行,我想这行是我的,我会返回它,但如果我不能删除它,这意味着另一个客户已经删除了它(并拥有它),我会查询下一行。听起来很合理。只有一点:如果您删除一行,并且处理该行的线程发生了一些事情,那么您将丢失数据。出于其他原因,我有一个备份表,如果客户端说我已处理完数据,那么我也会从备份表中删除行,否则我将从备份表中恢复数据。