高效地识别大型集合中的更改,并由多个工作人员专门处理更改?

7rfyedvj  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(154)

我有一套1米左右的尺寸。集合中的随机项目经常被触摸到脏东西(~10k/m,有重复)。管家守护程序的目标是通过对每个脏项执行重量级的清理任务(例如,每个任务1分钟)来再次清理脏项。在清理任务期间,相关项再次被触摸是很常见的(这无关紧要)。由于任务的性质,不允许同时对同一项执行并发任务。
这个问题的正确解决办法是什么?为了更好地解释这一点,这里有一个如何解决它的大致思路:

原始解决方案1:

“脏集”跟踪所有被触摸的项目:只要一个项目被触摸,它就会被添加到脏集(e、 g.基于redis,每个项都是名为“dirty set”的散列空间中的一个键值。
多个housekeeper守护程序示例同时运行(例如microservice示例)。每个管家守护进程都试图通过以下方式获取可用的项目:
2.1. 从脏集合中最多查看n个项目(根据它可以支持的任务容量)。
2.2. 对于每个偷看的项目,请尝试将其锁定,以便其他节点不会锁定(稍后将在#4中解释)。
2.3. 从脏项集中删除成功锁定的项。
对于每个获得的项目,houseceper daemon提交一个任务。

2中的锁是一个分布式锁,它确保只有一个housekeeper守护进程节点可以处理该项(e、 g.基于redis的锁:redlock,或基于mongodb的锁:具有唯一索引的专用集合)

天真的解决方案2:

与解决方案1类似,但使用数据库表/集合来实现脏集和锁。e、 g.对于mongodb,一个具有类似{itemid:string, dirty:boolean, lock:timestamp}. 基于此,“add to dirty set”是一个非锁定的简单写入,它将dirty字段更新为true,“peek,remove from dirty,and lock”将成为db转换(query n dirty=true and non locked,update dirty field to false and update lock)。
解决方案2似乎更为完整。但是,它有高频db write(adddirty set),这是需要避免的。
有什么更好的办法解决这个问题?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题