我对mongo很新,所以我想在这里实现的可能是不可能的。到目前为止,我的研究尚无定论......
我的方案如下:我有一个可能有多个实例运行的应用程序。这些实例正在处理一些数据,当处理失败时,它们会在mongo集合中写入失败项的ID(“error”)。
有时我想重试处理这些项目。因此,应用程序会以固定的时间间隔从集合中读取所有ID,然后删除所有记录。现在,这是一个明显的竞争条件。两个实例可能会读取相同的数据,这会使要完成的工作翻倍。也可能会错过一些ID。
我的问题如下:是否有任何方法可以以分布式原子方式读取和删除这些记录?我正在考虑锁定集合,但为此我在java驱动程序的文档中找不到任何支持。我也试图寻找一种findAndDrop()
类似的方法,但到目前为止还没有运气。
我知道像领导者选举这样的技巧,这很可能会解决这个问题,但我想看看它是否可以更容易地完成。
答案 0 :(得分:0)
您可以将 BlockingQueue 与多个生产者 - 单个消费者方法一起使用,因为您有多个生产者来生成ID并使用单个消费者删除它们。
答案 1 :(得分:0)
毕竟,我发现无法用mongo实现这一点。 但是,由于这是一个heroku应用程序,我将ID存储在Redis集合中。我找到的This库为Jedis实现了一个分布式Redis锁,所以这个解决方法解决了我的问题。